Browse Source

chore: 10-27

bzkf3 2 years ago
parent
commit
b17ef5c558

+ 2 - 1
package.json

@@ -23,8 +23,9 @@
     "axios": "^0.26.1",
     "clipboard": "^2.0.11",
     "default-passive-events": "^2.0.0",
-    "echarts": "^5.3.2",
+    "echarts": "^5.4.0",
     "element-ui": "^2.15.6",
+    "lodash-es": "^4.17.21",
     "normalize.css": "^8.0.1",
     "path-browserify": "^1.0.1",
     "path-to-regexp": "^6.2.0",

+ 1 - 1
public/config.js

@@ -31,4 +31,4 @@ function isWhich() {
         return production
     }
 }
-window.globalVariables = isWhich()
+window.globalVariables = window.GLOBAL_CONFIG = isWhich()

+ 2 - 2
src/components/FilePreview/index.vue

@@ -17,8 +17,8 @@
         <img class="w-full object-contain" :src="getFullUrl(url)" />
       </div>
     </template>
-    <!-- <el-result v-else-if="type === 'other'" icon="error" title="错误信息" sub-title="文件格式不支持">
-    </el-result> -->
+    <el-result v-else-if="type === 'other'" icon="error" title="错误信息" sub-title="文件格式不支持">
+    </el-result>
   </div>
 </template>
 

+ 61 - 0
src/components/RemoteSelect/index.vue

@@ -0,0 +1,61 @@
+<script>
+import { defineComponent, ref } from "@vue/composition-api";
+import request from "@/utils/request";
+
+export default defineComponent({
+  props: {
+    value: String,
+    label: String,
+    url: {
+      type: String,
+      default: "/common/sjzd/option"
+    },
+    d: Object,
+    field: {
+      type: String,
+      default: "v,n"
+    },
+  },
+  setup(props, content) {
+
+    const fields = props.field.split(',');
+    const attrs = content.attrs;
+    const modelValue = ref()
+
+    const options = ref([]);
+
+    request({
+      url: props.url,
+      data: {
+        limit: 99,
+        ...props.d,
+      }
+    }).then(res => {
+      options.value = (res.data.option || res.data.page_data).map((item) => ({
+        value: item[fields[0]],
+        label: item[fields[1]],
+      }));
+      if (props.value) {
+        modelValue.value = options.value.find(item => item.value === props.value);
+      }
+    })
+
+    function handleChange(item) {
+      content.emit('input', item.value);
+      content.emit('update:label', item.label);
+    }
+
+    return {
+      modelValue,
+      options,
+      handleChange
+    };
+  },
+});
+</script>
+
+<template>
+  <el-select v-model="modelValue" value-key="value" filterable @change="handleChange">
+    <el-option v-for="(option) in options" :key="option.value" :label="option.label" :value="option" />
+  </el-select>
+</template>

+ 2 - 2
src/views/dddx/ddrw/components/AddAndEdit.vue

@@ -19,7 +19,7 @@
         <el-input v-model="dialogForm.lc_bt_name" placeholder="请填写必填项名称"></el-input>
       </el-form-item>
       <el-form-item label="任务起始时间" prop="lc_fj_bz">
-        <el-date-picker v-model="time" type="datetimerange" @change="handleTimeChange" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%;" />
+        <el-date-picker v-model="time" type="datetimerange" @change="handleTimeChange" value-format="yyyy-MM-DD HH:mm:ss" style="width: 100%;" />
       </el-form-item>
       <el-form-item label="任务内容" prop="lc_fj_bz">
         <el-input v-model="dialogForm.lc_fj_bz"></el-input>
@@ -105,4 +105,4 @@ export default {
 </script>
 
 <style>
-</style>
+</style>

+ 2 - 2
src/views/dddx/ddrw/components/AddAndEditIndicator.vue

@@ -19,7 +19,7 @@
         <el-input v-model="dialogForm.lc_bt_name" placeholder="请填写必填项名称"></el-input>
       </el-form-item>
       <el-form-item label="任务起始时间" prop="lc_fj_bz">
-        <el-date-picker v-model="time" type="datetimerange" @change="handleTimeChange" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%;" />
+        <el-date-picker v-model="time" type="datetimerange" @change="handleTimeChange" value-format="yyyy-MM-DD HH:mm:ss" style="width: 100%;" />
       </el-form-item>
       <el-form-item label="任务内容" prop="lc_fj_bz">
         <el-input v-model="dialogForm.lc_fj_bz"></el-input>
@@ -105,4 +105,4 @@ export default {
 </script>
 
 <style>
-</style>
+</style>

+ 174 - 154
src/views/xxgzjc/bbtj.vue

@@ -1,11 +1,11 @@
 <script>
-  import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
-  import request from '~/utils/request';
-  import { Message } from 'element-ui'
+import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
+import request from '~/utils/request';
+import { Message } from 'element-ui'
 
-  export default defineComponent({
-    props: [],
-    setup(props){
+export default defineComponent({
+  props: [],
+  setup(props) {
     const _this = getCurrentInstance().proxy;
     // #region (constant)
     const TABLE_KEY = 'jxtj_id'
@@ -24,15 +24,15 @@
     // #region (type)
     // type TYPE_TABLE_FIELD = {
     //   [TABLE_KEY]: string;
-    //   
+    //
     //   'jxtj_name': string; // 报表名称
-    //   
+    //
     //   'jxtj_cjsj': string; // 创建时间
-    //   
+    //
     //   'jxtj_content_json': string; // 报表内容JSON
-    //   
+    //
     //   'jxj_id': string; // 关联检查任务
-    //   
+    //
     // }
     // #endregion
 
@@ -42,174 +42,177 @@
     const handleQueryFormBtn_search = () => {
       queryApi()
     }
-      // #endregion
+    // #endregion
 
-      // #region (table selection)
-      const multipleSelection = ref([])
-      const handleSelectionChange = (val) => {
-        multipleSelection.value = val
-      }
-      // #endregion
+    // #region (table selection)
+    const multipleSelection = ref([])
+    const handleSelectionChange = (val) => {
+      multipleSelection.value = val
+    }
+    // #endregion
 
-      // #region (table row)
-      const handleTableRowBtn_add = () => {
+    // #region (table row)
+    const handleTableRowBtn_add = () => {
       whichDialogSubmit = 'add'
       dialogForm_Data.value = {}
       dialogVisible_addOrEdit.value = true
     }
-      const handleTableRowBtn_delete = async () => {
-      await deleteApi(multipleSelection.value.map((item)=>item[TABLE_KEY]))
+    const handleTableRowBtn_delete = async () => {
+      await deleteApi(multipleSelection.value.map((item) => item[TABLE_KEY]))
       queryApi()
     }
-        // #endregion
+    // #endregion
 
-        // #region (table body)
-        const tableData = ref([])
-        const DetailName = '-XXGZJC-BBTJ'
-        const DetailParam = 'aid'
+    // #region (table body)
+    const tableData = ref([])
+    const DetailName = '-XXGZJC-BBTJ'
+    const DetailParam = 'aid'
 
-        const handleTableColBtn_edit = async (scope) => {
+    const handleTableColBtn_edit = async (scope) => {
       whichDialogSubmit = 'edit'
       const res = await detailApi(scope.row[TABLE_KEY])
       dialogForm_Data.value = (res.data.one_info)
       dialogVisible_addOrEdit.value = true
     }
-        const handleTableColBtn_detail = (scope) => {
-      instance.$router.push({ name:DetailName, params:{ [DetailParam]:scope.row[TABLE_KEY]} })
+    const handleTableColBtn_detail = (scope) => {
+      // instance.$router.push({ name:DetailName, params:{ [DetailParam]:scope.row[TABLE_KEY]} })
+      dialogVisible_detail.value = true
     }
-        const handleTableColBtn_delete = async (scope) => {
+    const handleTableColBtn_delete = async (scope) => {
       await deleteApi(scope.row[TABLE_KEY])
       queryApi()
     }
-          // #endregion
+    // #endregion
 
-          // #region (pagination)
-          const total = ref(0)
-          const limit = ref(10)
+    // #region (pagination)
+    const total = ref(0)
+    const limit = ref(10)
 
-          const currentPage = ref(1)
-          function handleCurrentChange() {
-            queryApi()
-          }
-          // #endregion
+    const currentPage = ref(1)
+    function handleCurrentChange() {
+      queryApi()
+    }
+    // #endregion
 
-          // #region (dialog base)
-          const dialogForm_Data = ref({})
+    // #region (dialog base)
+    const dialogForm_Data = ref({})
 
-          const handleDialogFormBtn_submit = async (formRefKey,extendData) => {
+    const handleDialogFormBtn_submit = async (formRefKey, extendData) => {
       const isValid = await (instance?.$refs[formRefKey]).validate()
       if (isValid) {
-        await API_MAP[whichDialogSubmit](({...dialogForm_Data.value,...extendData}))
+        await API_MAP[whichDialogSubmit](({ ...dialogForm_Data.value, ...extendData }))
         handleDialogFormBtn_cancel()
         queryApi()
       }
     }
-          const handleDialogFormBtn_cancel = (formRefKey) => {
+    const handleDialogFormBtn_cancel = (formRefKey) => {
       dialogVisible_addOrEdit.value = false
     }
-            // #endregion
-
-            // #region (dialog add/edit)
-            const dialogVisible_addOrEdit = ref(false)
-
-            const dialogForm_Ref_addOrEdit = ref()
-            const dialogForm_Rules_addOrEdit = reactive({
-          'jxtj_name': { required: true, message: '报表名称不能为空', trigger: 'submit' },
-          'jxtj_cjsj': { required: true, message: '创建时间不能为空', trigger: 'submit' },
-          'jxtj_content_json': { required: true, message: '报表内容JSON不能为空', trigger: 'submit' },
-          'jxj_id': { required: true, message: '关联检查任务不能为空', trigger: 'submit' },
-            })
-            // #endregion
-
-            // #region (request api):
-            function queryApi() {
-              loading_table.value = true
-              return request({
-                url: URL_CUT + '/index',
-                data: {
-                  ...queryForm_Data.value,
-                  limit: limit.value,
-                  page: currentPage.value
-                }
-              }).then((response) => {
-                const { data } = response
-                total.value = parseInt(data.total_rows)
-                tableData.value = data.page_data
-                return response
-              }).then(() => {
-                loading_table.value = false
-              })
-            }
-
-            function addApi(data) {
-              return request({
-                url: URL_CUT + '/add',
-                data: {
-                  [URL_SUBMIT_KEY]: data,
-                }
-              })
-            }
-
-            function editApi(data) {
-              return request({
-                url: URL_CUT + '/edit',
-                data: {
-                  [TABLE_KEY]: data[TABLE_KEY],
-                  [URL_SUBMIT_KEY]:{},
-        }
-          })
-        }
+    // #endregion
 
-        function deleteApi(id) {
-          return request({
-            url: URL_CUT + '/delete',
-            data: {
-              [TABLE_KEY]: id,
-            }
-          })
-        }
+    // #region (dialog add/edit)
+    const dialogVisible_addOrEdit = ref(false)
+
+    const dialogForm_Ref_addOrEdit = ref()
+    const dialogForm_Rules_addOrEdit = reactive({
+      'jxtj_name': { required: true, message: '报表名称不能为空', trigger: 'submit' },
+      'jxtj_cjsj': { required: true, message: '创建时间不能为空', trigger: 'submit' },
+      'jxtj_content_json': { required: true, message: '报表内容JSON不能为空', trigger: 'submit' },
+      'jxj_id': { required: true, message: '关联检查任务不能为空', trigger: 'submit' },
+    })
+    // #endregion
 
-        function detailApi(id) {
-          return request({
-            url: URL_CUT + '/detail',
-            data: {
-              [TABLE_KEY]: id,
-            }
-          })
+    // #region (request api):
+    function queryApi() {
+      loading_table.value = true
+      return request({
+        url: URL_CUT + '/index',
+        data: {
+          ...queryForm_Data.value,
+          limit: limit.value,
+          page: currentPage.value
         }
+      }).then((response) => {
+        const { data } = response
+        total.value = parseInt(data.total_rows)
+        tableData.value = data.page_data
+        return response
+      }).then(() => {
+        loading_table.value = false
+      })
+    }
 
-        function importApi(data) {
-          return request({
-            $type: 'import',
-            url: URL_CUT + '/import',
-            data
-          })
+    function addApi(data) {
+      return request({
+        url: URL_CUT + '/add',
+        data: {
+          [URL_SUBMIT_KEY]: data,
         }
+      })
+    }
 
-        function exportApi() {
-          return download(URL_CUT + '/index', queryForm_Data.value)
+    function editApi(data) {
+      return request({
+        url: URL_CUT + '/edit',
+        data: {
+          [TABLE_KEY]: data[TABLE_KEY],
+          [URL_SUBMIT_KEY]: {},
         }
+      })
+    }
 
-        const API_MAP = {
-          query: queryApi,
-          add: addApi,
-          edit: editApi,
-          delete: deleteApi,
-          detail: detailApi,
-          import: importApi,
-          export: exportApi,
+    function deleteApi(id) {
+      return request({
+        url: URL_CUT + '/delete',
+        data: {
+          [TABLE_KEY]: id,
         }
-        // #endregion
+      })
+    }
 
-        // #region (page init)
-        function init() {
-          queryApi()
+    function detailApi(id) {
+      return request({
+        url: URL_CUT + '/detail',
+        data: {
+          [TABLE_KEY]: id,
         }
-        init()
-        // #endregion
+      })
+    }
 
-        return {
-          queryForm_Data,
+    function importApi(data) {
+      return request({
+        $type: 'import',
+        url: URL_CUT + '/import',
+        data
+      })
+    }
+
+    function exportApi() {
+      return download(URL_CUT + '/index', queryForm_Data.value)
+    }
+
+    const API_MAP = {
+      query: queryApi,
+      add: addApi,
+      edit: editApi,
+      delete: deleteApi,
+      detail: detailApi,
+      import: importApi,
+      export: exportApi,
+    }
+    // #endregion
+
+    // #region (page init)
+    function init() {
+      queryApi()
+    }
+    init()
+    // #endregion
+
+
+    const dialogVisible_detail = ref(false)
+    return {
+      queryForm_Data,
       loading_table,
       tableData,
       dialogVisible_addOrEdit,
@@ -228,28 +231,32 @@
       handleSelectionChange,
       handleTableRowBtn_delete,
       handleDialogFormBtn_submit,
-      handleDialogFormBtn_cancel
-        }
-      }
-    })
+      handleDialogFormBtn_cancel,
+
+      dialogVisible_detail
+    }
+  }
+})
 </script>
 
 
 <template>
   <div class="card flex-grow flex flex-col">
     <el-form inline :model="queryForm_Data">
-      <!-- <el-form-item label="关键字"><el-input v-model="queryForm_Data.keyword" ></el-input></el-form-item> -->
-      <el-form-item label="报表名称"><el-input v-model="queryForm_Data.jxtj_name" clearable /></el-form-item>
-      <el-form-item label="创建时间"><el-date-picker type="date" v-model="queryForm_Data.jxtj_cjsj" value-format="YYYY-MM-DD" clearable /></el-form-item>
+      <el-form-item label="关键字">
+        <el-input v-model="queryForm_Data.keyword"></el-input>
+      </el-form-item>
+      <!-- <el-form-item label="报表名称"><el-input v-model="queryForm_Data.jxtj_name" clearable /></el-form-item>
+      <el-form-item label="创建时间"><el-date-picker type="date" v-model="queryForm_Data.jxtj_cjsj" value-format="yyyy-MM-DD" clearable /></el-form-item>
       <el-form-item label="报表内容JSON"><el-input v-model="queryForm_Data.jxtj_content_json" type="textarea" /></el-form-item>
-      <el-form-item label="关联检查任务"><el-input v-model="queryForm_Data.jxj_id" clearable /></el-form-item>
+      <el-form-item label="关联检查任务"><el-input v-model="queryForm_Data.jxj_id" clearable /></el-form-item> -->
       <el-form-item>
         <el-button @click="handleQueryFormBtn_search" type="primary">搜索</el-button>
       </el-form-item>
     </el-form>
     <div class="divider"></div>
     <div>
-      <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button>
+      <!-- <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button> -->
       <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button>
     </div>
 
@@ -260,13 +267,14 @@
         <el-table-column type="selection"></el-table-column>
         <el-table-column prop="jxtj_name" label="报表名称" width="auto" show-overflow-tooltip></el-table-column>
         <el-table-column prop="jxtj_cjsj" label="创建时间" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxtj_content_json" label="报表内容JSON" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxj_id" label="关联检查任务" width="auto" show-overflow-tooltip></el-table-column>
+        <!-- <el-table-column prop="jxtj_content_json" label="报表内容JSON" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="jxj_id" label="关联检查任务" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column label="操作" fixed="right">
           <template #default="scope">
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="text">编辑</el-button>
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="text">详情</el-button>
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="text">删除</el-button>
+            <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="text">编辑</el-button> -->
+            <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="text">详情
+            </el-button>
+            <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="text">删除</el-button> -->
           </template>
         </el-table-column>
       </el-table>
@@ -280,10 +288,18 @@
     <el-dialog :visible.sync="dialogVisible_addOrEdit" append-to-body destroy-on-close>
       <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit"
         label-width="120px">
-        <el-form-item label="报表名称" prop="jxtj_name"><el-input v-model="dialogForm_Data.jxtj_name" clearable /></el-form-item>
-        <el-form-item label="创建时间" prop="jxtj_cjsj"><el-date-picker type="date" v-model="dialogForm_Data.jxtj_cjsj" value-format="YYYY-MM-DD" clearable /></el-form-item>
-        <el-form-item label="报表内容JSON" prop="jxtj_content_json"><el-input v-model="dialogForm_Data.jxtj_content_json" type="textarea" /></el-form-item>
-        <el-form-item label="关联检查任务" prop="jxj_id"><el-input v-model="dialogForm_Data.jxj_id" clearable /></el-form-item>
+        <el-form-item label="报表名称" prop="jxtj_name">
+          <el-input v-model="dialogForm_Data.jxtj_name" clearable />
+        </el-form-item>
+        <el-form-item label="创建时间" prop="jxtj_cjsj">
+          <el-date-picker type="date" v-model="dialogForm_Data.jxtj_cjsj" value-format="yyyy-MM-DD" clearable />
+        </el-form-item>
+        <el-form-item label="报表内容JSON" prop="jxtj_content_json">
+          <el-input v-model="dialogForm_Data.jxtj_content_json" type="textarea" />
+        </el-form-item>
+        <el-form-item label="关联检查任务" prop="jxj_id">
+          <el-input v-model="dialogForm_Data.jxj_id" clearable />
+        </el-form-item>
         <div class="flex justify-center">
           <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_addOrEdit')" type="primary">提交
           </el-button>
@@ -292,6 +308,10 @@
         </div>
       </el-form>
     </el-dialog>
+
+    <el-dialog :visible.sync="dialogVisible_detail" append-to-body destroy-on-close title="查看报表详情">
+
+    </el-dialog>
   </div>
 
 

+ 42 - 14
src/views/xxgzjc/dzmb/detail.vue

@@ -2,11 +2,13 @@
 import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
 import request from '~/utils/request';
 // import { Message } from 'element-ui'
+import { pick } from 'lodash-es';
 import FileUpload from '~/components/FileUpload/index.vue';
+import FilePreview from '~/components/FilePreview/index.vue';
 
 export default defineComponent({
   props: ['id'],
-  components: { FileUpload },
+  components: { FileUpload,FilePreview },
   setup(props) {
     const _this = getCurrentInstance().proxy;
     // #region (constant)
@@ -79,8 +81,13 @@ export default defineComponent({
       dialogForm_Data.value = (res.data.one_info)
       dialogVisible_addOrEdit.value = true
     }
+    const dialogVisible_detail = ref(false)
+    const dialogForm_detail_Data = ref()
     const handleTableColBtn_detail = (scope) => {
-      instance.$router.push({ name: DetailName, params: { [DetailParam]: scope.row[TABLE_KEY] } })
+      // instance.$router.push({ name: DetailName, params: { [DetailParam]: scope.row[TABLE_KEY] } })
+
+      dialogForm_detail_Data.value = scope.row.jxkm_file
+      dialogVisible_detail.value = true
     }
     const handleTableColBtn_delete = async (scope) => {
       await deleteApi(scope.row[TABLE_KEY])
@@ -126,6 +133,11 @@ export default defineComponent({
     })
     // #endregion
 
+    async function handleTableColBtn_publish(scope) {
+      await editApi({ ...scope.row, jxkm_date: (new Date()).toLocaleDateString(), jxkm_status: '1' })
+      queryApi()
+    }
+
     // #region (request api):
     function queryApi() {
       loading_table.value = true
@@ -160,7 +172,7 @@ export default defineComponent({
         url: URL_CUT + '/edit',
         data: {
           [TABLE_KEY]: data[TABLE_KEY],
-          [URL_SUBMIT_KEY]: data,
+          [URL_SUBMIT_KEY]: pick(data, ['jxkm_name', 'jxkm_date', 'jxkm_status', 'jxk_id', 'jxkm_file']),
         }
       })
     }
@@ -234,7 +246,12 @@ export default defineComponent({
       handleTableRowBtn_delete,
       handleDialogFormBtn_submit,
       handleDialogFormBtn_cancel,
-      route
+
+      route,
+      handleTableColBtn_publish,
+      dialogVisible_detail,
+      dialogForm_detail_Data,
+
     }
   }
 })
@@ -250,10 +267,10 @@ export default defineComponent({
       <el-form-item label="模板名称">
         <el-input v-model="queryForm_Data.jxkm_name" clearable />
       </el-form-item>
-      <el-form-item label="发布日期">
-        <el-date-picker type="datetime" v-model="queryForm_Data.jxkm_date" value-format="YYYY-MM-DD HH:mm:ss"
+      <!-- <el-form-item label="发布日期">
+        <el-date-picker type="date" v-model="queryForm_Data.jxkm_date" value-format="yyyy-MM-DD"
           clearable />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="发布状态">
         <el-select v-model="queryForm_Data.jxkm_status" clearable filterable>
           <el-option label="已发布" value="1" />
@@ -269,7 +286,7 @@ export default defineComponent({
     </el-form>
     <div class="divider"></div>
     <div>
-      <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button>
+      <el-button @click="handleTableRowBtn_add" type="primary">新增模板</el-button>
       <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button>
     </div>
 
@@ -279,12 +296,19 @@ export default defineComponent({
         element-loading-background="#ffffff70">
         <el-table-column type="selection"></el-table-column>
         <el-table-column prop="jxkm_name" label="模板名称" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxkm_date" label="发布日期" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="jxkm_date" label="发布日期" width="auto" show-overflow-tooltip>
+          <template #default="scope">
+            {{ scope.row.jxkm_status_option_k === '1' ? scope.row.jxkm_date : '--' }}
+          </template>
+        </el-table-column>
         <el-table-column prop="jxkm_status" label="发布状态" width="auto" show-overflow-tooltip></el-table-column>
         <!-- <el-table-column prop="jxk_id" label="所属科室分组" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column label="操作" fixed="right">
           <template #default="scope">
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="text">编辑</el-button>
+            <el-button :disabled="scope.row.jxkm_status_option_k === '1'" link :auto-insert-space="false"
+              @click="handleTableColBtn_publish(scope)" type="text">发布
+            </el-button>
+            <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="text">编辑</el-button> -->
             <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="text">详情
             </el-button>
             <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="text">删除
@@ -300,13 +324,13 @@ export default defineComponent({
     </div>
 
     <el-dialog :visible.sync="dialogVisible_addOrEdit" append-to-body destroy-on-close>
-      <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit"
-        label-width="120px">
+      <el-form :key="dialogVisible_addOrEdit" :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit"
+        :rules="dialogForm_Rules_addOrEdit" label-width="120px">
         <el-form-item label="模板名称" prop="jxkm_name">
           <el-input v-model="dialogForm_Data.jxkm_name" clearable />
         </el-form-item>
         <!-- <el-form-item label="发布日期" prop="jxkm_date">
-          <el-date-picker type="datetime" v-model="dialogForm_Data.jxkm_date" value-format="YYYY-MM-DD HH:mm:ss"
+          <el-date-picker type="datetime" v-model="dialogForm_Data.jxkm_date" value-format="yyyy-MM-DD HH:mm:ss"
             clearable />
         </el-form-item>
         <el-form-item label="发布状态" prop="jxkm_status">
@@ -319,7 +343,7 @@ export default defineComponent({
           <el-input v-model="dialogForm_Data.jxk_id" clearable />
         </el-form-item> -->
         <el-form-item label="模板文件" prop="jxkm_file">
-          <FileUpload v-model:part="dialogForm_Data.jxkm_file" clearable />
+          <FileUpload :part.sync="dialogForm_Data.jxkm_file" :limit="1" clearable />
         </el-form-item>
         <div class="flex justify-center">
           <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_addOrEdit')" type="primary">提交
@@ -329,6 +353,10 @@ export default defineComponent({
         </div>
       </el-form>
     </el-dialog>
+
+    <el-dialog :visible.sync="dialogVisible_detail" append-to-body destroy-on-close>
+      <FilePreview :key="dialogForm_detail_Data" :url="dialogForm_detail_Data" class="min-w-400px min-h-300px"></FilePreview>
+    </el-dialog>
   </div>
 
 

+ 63 - 2
src/views/xxgzjc/dzmb/index.vue

@@ -2,9 +2,13 @@
 import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
 import request from '~/utils/request';
 import { Message } from 'element-ui'
+import { pick } from 'lodash-es';
+import RemoteSelect from '~/components/RemoteSelect/index.vue';
+import FileUpload from '~/components/FileUpload/index.vue';
 
 export default defineComponent({
   props: [],
+  components: { RemoteSelect, FileUpload },
   setup(props) {
     const _this = getCurrentInstance().proxy;
     // #region (constant)
@@ -202,6 +206,33 @@ export default defineComponent({
     init()
     // #endregion
 
+    const dialogVisible_addOrEdit_example = ref(false)
+    const dialogForm_Ref_addOrEdit_example = ref()
+    const dialogForm_Rules_addOrEdit_example = ref({
+      'jxkm_name': { required: true, message: '模板名称不能为空', trigger: 'submit' },
+      'jxkm_date': { required: true, message: '发布日期不能为空', trigger: 'submit' },
+      'jxkm_status': { required: true, message: '发布状态不能为空', trigger: 'submit' },
+      'jxk_id': { required: true, message: '所属科室分组不能为空', trigger: 'submit' },
+    })
+    const dialogForm_Data_example = ref({})
+    function handleTableRowBtn_add_example() {
+      dialogForm_Data_example.value = {}
+      dialogVisible_addOrEdit_example.value = true
+    }
+    const handleDialogFormBtn_submit_example = async (formRefKey, extendData) => {
+      const isValid = await (instance?.$refs[formRefKey]).validate()
+      if (isValid) {
+        await request({
+          url: '/jdbg/xxgzjc_ksmb/add',
+          data: {
+            'jdbg_xxgzjc_ksmb': pick(dialogForm_Data_example.value, ['jxkm_name', 'jxkm_date', 'jxkm_status', 'jxk_id', 'jxkm_file']),
+          }
+        })
+        dialogVisible_addOrEdit_example.value = false
+        queryApi()
+      }
+    }
+
     return {
       queryForm_Data,
       loading_table,
@@ -222,7 +253,14 @@ export default defineComponent({
       handleSelectionChange,
       handleTableRowBtn_delete,
       handleDialogFormBtn_submit,
-      handleDialogFormBtn_cancel
+      handleDialogFormBtn_cancel,
+
+      dialogVisible_addOrEdit_example,
+      dialogForm_Ref_addOrEdit_example,
+      dialogForm_Rules_addOrEdit_example,
+      dialogForm_Data_example,
+      handleTableRowBtn_add_example,
+      handleDialogFormBtn_submit_example
     }
   }
 })
@@ -243,7 +281,8 @@ export default defineComponent({
     </el-form>
     <div class="divider"></div>
     <div>
-      <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button>
+      <el-button @click="handleTableRowBtn_add" type="primary">新增科室</el-button>
+      <el-button @click="handleTableRowBtn_add_example" type="primary">新增模板</el-button>
       <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button>
     </div>
 
@@ -286,6 +325,28 @@ export default defineComponent({
         </div>
       </el-form>
     </el-dialog>
+
+    <el-dialog :visible.sync="dialogVisible_addOrEdit_example" append-to-body destroy-on-close>
+      <el-form :key="dialogVisible_addOrEdit_example" :model="dialogForm_Data_example"
+        ref="dialogForm_Ref_addOrEdit_example" :rules="dialogForm_Rules_addOrEdit_example" label-width="120px">
+        <el-form-item label="模板名称" prop="jxkm_name">
+          <el-input v-model="dialogForm_Data_example.jxkm_name" clearable />
+        </el-form-item>
+        <el-form-item label="所属科室分组" prop="jxk_id">
+          <RemoteSelect v-model="dialogForm_Data_example.jxk_id" url="/jdbg/xxgzjc_ksfz/index"
+            field="jxk_id,jxk_name" />
+        </el-form-item>
+        <el-form-item label="模板文件" prop="jxkm_file">
+          <FileUpload :part.sync="dialogForm_Data_example.jxkm_file" :limit="1" clearable />
+        </el-form-item>
+        <div class="flex justify-center">
+          <el-button @click="handleDialogFormBtn_submit_example('dialogForm_Ref_addOrEdit_example')" type="primary">提交
+          </el-button>
+          <el-button @click="dialogVisible_addOrEdit_example = false" type="default">取消
+          </el-button>
+        </div>
+      </el-form>
+    </el-dialog>
   </div>
 
 

+ 18 - 18
src/views/xxgzjc/jcbd/detail.vue

@@ -5,7 +5,7 @@
 
   export default defineComponent({
     props: ['id'],
-    setup() {
+    setup(props) {
       // #region (constant)
       const TABLE_KEY = 'jxjd_id'
       const URL_CUT = '/jdbg/xxgzjc_jcbd'
@@ -50,39 +50,39 @@
 </script>
 
 <template>
-  <div :loading="loading">
+  <div :loading="loading" class="text-sm">
     <template v-if="detail_Data">
       <div class="flex">
-        <div>检查任务名称</div>
-        <div>{{detail_Data.jxjd_name}}</div>
+        <!-- <div>检查任务名称</div> -->
+        <div class="text-lg">{{detail_Data.jxjd_name}}</div>
       </div>
-      <div class="flex">
+      <!-- <div class="flex">
         <div>检查任务编号</div>
         <div>{{detail_Data.jxj_id}}</div>
-      </div>
-      <div class="flex">
+      </div> -->
+      <div class="flex py-2">
         <div>学校名称</div>
-        <div>{{detail_Data.jxjd_sm_name}}</div>
+        <div class="text-hex-969696 ml-4">{{detail_Data.jxjd_sm_name}}</div>
       </div>
-      <div class="flex">
+      <!-- <div class="flex">
         <div>学校编号</div>
         <div>{{detail_Data.jxjd_sm_id}}</div>
-      </div>
-      <div class="flex">
+      </div> -->
+      <div class="flex py-2">
         <div>检查组成员</div>
-        <div>{{detail_Data.jxjd_jczcy}}</div>
+        <div class="text-hex-969696 ml-4">{{detail_Data.jxjd_jczcy}}</div>
       </div>
-      <div class="flex">
+      <!-- <div class="flex">
         <div>检查组成员JSON</div>
         <div>{{detail_Data.jxjd_jczcy_json}}</div>
-      </div>
-      <div class="flex">
+      </div> -->
+      <div class="flex flex-col mt-4">
         <div>检查组意见</div>
-        <div>{{detail_Data.jxjd_jczyj}}</div>
+        <div class="text-hex-969696 mt-2">{{detail_Data.jxjd_jczyj}}</div>
       </div>
-      <div class="flex">
+      <div class="flex flex-col mt-4">
         <div>学校困难及问题</div>
-        <div>{{detail_Data.jxj_xxknjwt}}</div>
+        <div class="text-hex-969696 mt-2">{{detail_Data.jxj_xxknjwt}}</div>
       </div>
     </template>
   </div>

+ 244 - 174
src/views/xxgzjc/jcbd/index.vue

@@ -1,11 +1,14 @@
 <script>
-  import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
-  import request from '~/utils/request';
-  import { Message } from 'element-ui'
-
-  export default defineComponent({
-    props: [],
-    setup(props){
+import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
+import request from '~/utils/request';
+import { Message } from 'element-ui'
+import RemoteSelect from '~/components/RemoteSelect/index.vue';
+import { omit } from 'lodash-es';
+
+export default defineComponent({
+  props: [],
+  components: { RemoteSelect },
+  setup(props) {
     const _this = getCurrentInstance().proxy;
     // #region (constant)
     const TABLE_KEY = 'jxjd_id'
@@ -24,23 +27,23 @@
     // #region (type)
     // type TYPE_TABLE_FIELD = {
     //   [TABLE_KEY]: string;
-    //   
+    //
     //   'jxjd_name': string; // 检查任务名称
-    //   
+    //
     //   'jxj_id': string; // 检查任务编号
-    //   
+    //
     //   'jxjd_sm_name': string; // 学校名称
-    //   
+    //
     //   'jxjd_sm_id': string; // 学校编号
-    //   
+    //
     //   'jxjd_jczcy': string; // 检查组成员
-    //   
+    //
     //   'jxjd_jczcy_json': string; // 检查组成员JSON
-    //   
+    //
     //   'jxjd_jczyj': string; // 检查组意见
-    //   
+    //
     //   'jxj_xxknjwt': string; // 学校困难及问题
-    //   
+    //
     // }
     // #endregion
 
@@ -50,178 +53,203 @@
     const handleQueryFormBtn_search = () => {
       queryApi()
     }
-      // #endregion
+    // #endregion
 
-      // #region (table selection)
-      const multipleSelection = ref([])
-      const handleSelectionChange = (val) => {
-        multipleSelection.value = val
-      }
-      // #endregion
+    // #region (table selection)
+    const multipleSelection = ref([])
+    const handleSelectionChange = (val) => {
+      multipleSelection.value = val
+    }
+    // #endregion
 
-      // #region (table row)
-      const handleTableRowBtn_add = () => {
+    // #region (table row)
+    const handleTableRowBtn_add = () => {
       whichDialogSubmit = 'add'
       dialogForm_Data.value = {}
       dialogVisible_addOrEdit.value = true
     }
-      const handleTableRowBtn_delete = async () => {
-      await deleteApi(multipleSelection.value.map((item)=>item[TABLE_KEY]))
+    const handleTableRowBtn_delete = async () => {
+      await deleteApi(multipleSelection.value.map((item) => item[TABLE_KEY]))
       queryApi()
     }
-        // #endregion
+    // #endregion
 
-        // #region (table body)
-        const tableData = ref([])
-        const DetailName = '-XXGZJC-JCBD-DETAIL'
-        const DetailParam = 'aid'
+    // #region (table body)
+    const tableData = ref([])
+    const DetailName = 'XXGZJC_JCBD_DETAIL'
+    const DetailParam = 'id'
 
-        const handleTableColBtn_edit = async (scope) => {
+    const handleTableColBtn_edit = async (scope) => {
       whichDialogSubmit = 'edit'
       const res = await detailApi(scope.row[TABLE_KEY])
       dialogForm_Data.value = (res.data.one_info)
       dialogVisible_addOrEdit.value = true
     }
-        const handleTableColBtn_detail = (scope) => {
-      instance.$router.push({ name:DetailName, params:{ [DetailParam]:scope.row[TABLE_KEY]} })
+    const handleTableColBtn_detail = (scope) => {
+      instance.$router.push({ name: DetailName, params: { [DetailParam]: scope.row[TABLE_KEY] } })
     }
-        const handleTableColBtn_delete = async (scope) => {
+    const handleTableColBtn_delete = async (scope) => {
       await deleteApi(scope.row[TABLE_KEY])
       queryApi()
     }
-          // #endregion
+    // #endregion
 
-          // #region (pagination)
-          const total = ref(0)
-          const limit = ref(10)
+    // #region (pagination)
+    const total = ref(0)
+    const limit = ref(10)
 
-          const currentPage = ref(1)
-          function handleCurrentChange() {
-            queryApi()
-          }
-          // #endregion
+    const currentPage = ref(1)
+    function handleCurrentChange() {
+      queryApi()
+    }
+    // #endregion
 
-          // #region (dialog base)
-          const dialogForm_Data = ref({})
+    // #region (dialog base)
+    const dialogForm_Data = ref({})
 
-          const handleDialogFormBtn_submit = async (formRefKey,extendData) => {
+    const handleDialogFormBtn_submit = async (formRefKey, extendData) => {
       const isValid = await (instance?.$refs[formRefKey]).validate()
       if (isValid) {
-        await API_MAP[whichDialogSubmit](({...dialogForm_Data.value,...extendData}))
+        const [jxjd_sm_id, jxjd_sm_name] = dialogForm_Data.value.jxjd_sm_obj.split('|')
+        await API_MAP[whichDialogSubmit](({ ...dialogForm_Data.value, ...extendData, jxjd_sm_name, jxjd_sm_id }))
         handleDialogFormBtn_cancel()
         queryApi()
       }
     }
-          const handleDialogFormBtn_cancel = (formRefKey) => {
+    const handleDialogFormBtn_cancel = (formRefKey) => {
       dialogVisible_addOrEdit.value = false
     }
-            // #endregion
-
-            // #region (dialog add/edit)
-            const dialogVisible_addOrEdit = ref(false)
-
-            const dialogForm_Ref_addOrEdit = ref()
-            const dialogForm_Rules_addOrEdit = reactive({
-          'jxjd_name': { required: true, message: '检查任务名称不能为空', trigger: 'submit' },
-          'jxj_id': { required: true, message: '检查任务编号不能为空', trigger: 'submit' },
-          'jxjd_sm_name': { required: true, message: '学校名称不能为空', trigger: 'submit' },
-          'jxjd_sm_id': { required: true, message: '学校编号不能为空', trigger: 'submit' },
-          'jxjd_jczcy': { required: true, message: '检查组成员不能为空', trigger: 'submit' },
-          'jxjd_jczcy_json': { required: true, message: '检查组成员JSON不能为空', trigger: 'submit' },
-          'jxjd_jczyj': { required: true, message: '检查组意见不能为空', trigger: 'submit' },
-          'jxj_xxknjwt': { required: true, message: '学校困难及问题不能为空', trigger: 'submit' },
-            })
-            // #endregion
-
-            // #region (request api):
-            function queryApi() {
-              loading_table.value = true
-              return request({
-                url: URL_CUT + '/index',
-                data: {
-                  ...queryForm_Data.value,
-                  limit: limit.value,
-                  page: currentPage.value
-                }
-              }).then((response) => {
-                const { data } = response
-                total.value = parseInt(data.total_rows)
-                tableData.value = data.page_data
-                return response
-              }).then(() => {
-                loading_table.value = false
-              })
-            }
-
-            function addApi(data) {
-              return request({
-                url: URL_CUT + '/add',
-                data: {
-                  [URL_SUBMIT_KEY]: data,
-                }
-              })
-            }
-
-            function editApi(data) {
-              return request({
-                url: URL_CUT + '/edit',
-                data: {
-                  [TABLE_KEY]: data[TABLE_KEY],
-                  [URL_SUBMIT_KEY]:{},
-        }
-          })
-        }
+    // #endregion
 
-        function deleteApi(id) {
-          return request({
-            url: URL_CUT + '/delete',
-            data: {
-              [TABLE_KEY]: id,
-            }
-          })
+    // #region (dialog add/edit)
+    const dialogVisible_addOrEdit = ref(false)
+
+    const dialogForm_Ref_addOrEdit = ref()
+    const dialogForm_Rules_addOrEdit = reactive({
+      'jxjd_name': { required: true, message: '检查任务名称不能为空', trigger: 'submit' },
+      'jxj_id': { required: true, message: '检查任务编号不能为空', trigger: 'submit' },
+      'jxjd_sm_obj': { required: true, message: '学校名称不能为空', trigger: 'submit' },
+      // 'jxjd_sm_name': { required: true, message: '学校名称不能为空', trigger: 'submit' },
+      // 'jxjd_sm_id': { required: true, message: '学校编号不能为空', trigger: 'submit' },
+      'jxjd_jczcy': { required: true, message: '检查组成员不能为空', trigger: 'submit' },
+      'jxjd_jczcy_json': { required: true, message: '检查组成员JSON不能为空', trigger: 'submit' },
+      'jxjd_jczyj': { required: true, message: '检查组意见不能为空', trigger: 'submit' },
+      'jxj_xxknjwt': { required: true, message: '学校困难及问题不能为空', trigger: 'submit' },
+    })
+    // #endregion
+
+    // #region (request api):
+    function queryApi() {
+      loading_table.value = true
+      return request({
+        url: URL_CUT + '/index',
+        data: {
+          ...queryForm_Data.value,
+          limit: limit.value,
+          page: currentPage.value
         }
+      }).then((response) => {
+        const { data } = response
+        total.value = parseInt(data.total_rows)
+        tableData.value = data.page_data
+        return response
+      }).then(() => {
+        loading_table.value = false
+      })
+    }
 
-        function detailApi(id) {
-          return request({
-            url: URL_CUT + '/detail',
-            data: {
-              [TABLE_KEY]: id,
-            }
-          })
+    function addApi(data) {
+      return request({
+        url: URL_CUT + '/add',
+        data: {
+          [URL_SUBMIT_KEY]: omit(data, ['jxjd_sm_obj']),
         }
+      })
+    }
 
-        function importApi(data) {
-          return request({
-            $type: 'import',
-            url: URL_CUT + '/import',
-            data
-          })
+    function editApi(data) {
+      return request({
+        url: URL_CUT + '/edit',
+        data: {
+          [TABLE_KEY]: data[TABLE_KEY],
+          [URL_SUBMIT_KEY]: {},
         }
+      })
+    }
 
-        function exportApi() {
-          return download(URL_CUT + '/index', queryForm_Data.value)
+    function deleteApi(id) {
+      return request({
+        url: URL_CUT + '/delete',
+        data: {
+          [TABLE_KEY]: id,
         }
+      })
+    }
 
-        const API_MAP = {
-          query: queryApi,
-          add: addApi,
-          edit: editApi,
-          delete: deleteApi,
-          detail: detailApi,
-          import: importApi,
-          export: exportApi,
+    function detailApi(id) {
+      return request({
+        url: URL_CUT + '/detail',
+        data: {
+          [TABLE_KEY]: id,
         }
-        // #endregion
+      })
+    }
+
+    function importApi(data) {
+      return request({
+        $type: 'import',
+        url: URL_CUT + '/import',
+        data
+      })
+    }
+
+    function exportApi() {
+      return download(URL_CUT + '/index', queryForm_Data.value)
+    }
 
-        // #region (page init)
-        function init() {
-          queryApi()
+    const API_MAP = {
+      query: queryApi,
+      add: addApi,
+      edit: editApi,
+      delete: deleteApi,
+      detail: detailApi,
+      import: importApi,
+      export: exportApi,
+    }
+    // #endregion
+
+    // #region (page init)
+    function init() {
+      queryApi()
+    }
+    init()
+    // #endregion
+
+    function handleTree(list) {
+      return list.map(item => {
+        const obj = Object.assign({
+          value: `${item.id}|${item.label}`
+          // value: { id: item.id, label: item.label }
+        }, item)
+        if (item.children) {
+          obj.children = handleTree(item.children)
         }
-        init()
-        // #endregion
+        return obj
+      })
+
+    }
+    let orgTree = ref()
+    request({
+      url: '/user/org/list_tree'
+    }).then(res => {
+      if (res.code === '1') {
+        orgTree.value = handleTree(res.data.one_info)
+        console.log('orgTree :>> ', orgTree.value);
+      }
+    })
 
-        return {
-          queryForm_Data,
+    return {
+      queryForm_Data,
       loading_table,
       tableData,
       dialogVisible_addOrEdit,
@@ -240,33 +268,53 @@
       handleSelectionChange,
       handleTableRowBtn_delete,
       handleDialogFormBtn_submit,
-      handleDialogFormBtn_cancel
-        }
-      }
-    })
+      handleDialogFormBtn_cancel,
+
+      orgTree,
+    }
+  }
+})
 </script>
 
 
 <template>
   <div class="card flex-grow flex flex-col">
     <el-form inline :model="queryForm_Data">
-      <!-- <el-form-item label="关键字"><el-input v-model="queryForm_Data.keyword" ></el-input></el-form-item> -->
-      <el-form-item label="检查任务名称"><el-input v-model="queryForm_Data.jxjd_name" clearable /></el-form-item>
-      <el-form-item label="检查任务编号"><el-input v-model="queryForm_Data.jxj_id" clearable /></el-form-item>
-      <el-form-item label="学校名称"><el-input v-model="queryForm_Data.jxjd_sm_name" clearable /></el-form-item>
-      <el-form-item label="学校编号"><el-input v-model="queryForm_Data.jxjd_sm_id" clearable /></el-form-item>
-      <el-form-item label="检查组成员"><el-input v-model="queryForm_Data.jxjd_jczcy" clearable /></el-form-item>
-      <el-form-item label="检查组成员JSON"><el-input v-model="queryForm_Data.jxjd_jczcy_json" type="textarea" /></el-form-item>
-      <el-form-item label="检查组意见"><el-input v-model="queryForm_Data.jxjd_jczyj" type="textarea" /></el-form-item>
-      <el-form-item label="学校困难及问题"><el-input v-model="queryForm_Data.jxj_xxknjwt" type="textarea" /></el-form-item>
+      <el-form-item label="关键字">
+        <el-input v-model="queryForm_Data.keyword"></el-input>
+      </el-form-item>
+      <!-- <el-form-item label="检查任务名称">
+        <el-input v-model="queryForm_Data.jxjd_name" clearable />
+      </el-form-item>
+      <el-form-item label="检查任务编号">
+        <el-input v-model="queryForm_Data.jxj_id" clearable />
+      </el-form-item>
+      <el-form-item label="学校名称">
+        <el-input v-model="queryForm_Data.jxjd_sm_name" clearable />
+      </el-form-item>
+      <el-form-item label="学校编号">
+        <el-input v-model="queryForm_Data.jxjd_sm_id" clearable />
+      </el-form-item>
+      <el-form-item label="检查组成员">
+        <el-input v-model="queryForm_Data.jxjd_jczcy" clearable />
+      </el-form-item>
+      <el-form-item label="检查组成员JSON">
+        <el-input v-model="queryForm_Data.jxjd_jczcy_json" type="textarea" />
+      </el-form-item>
+      <el-form-item label="检查组意见">
+        <el-input v-model="queryForm_Data.jxjd_jczyj" type="textarea" />
+      </el-form-item>
+      <el-form-item label="学校困难及问题">
+        <el-input v-model="queryForm_Data.jxj_xxknjwt" type="textarea" />
+      </el-form-item> -->
       <el-form-item>
         <el-button @click="handleQueryFormBtn_search" type="primary">搜索</el-button>
       </el-form-item>
     </el-form>
     <div class="divider"></div>
     <div>
-      <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button>
-      <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button>
+      <el-button @click="handleTableRowBtn_add" type="primary">新建反馈意见</el-button>
+      <!-- <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button> -->
     </div>
 
     <div class="divider"></div>
@@ -275,18 +323,20 @@
         element-loading-background="#ffffff70">
         <el-table-column type="selection"></el-table-column>
         <el-table-column prop="jxjd_name" label="检查任务名称" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxj_id" label="检查任务编号" width="auto" show-overflow-tooltip></el-table-column>
+        <!-- <el-table-column prop="jxj_id" label="检查任务编号" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column prop="jxjd_sm_name" label="学校名称" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxjd_sm_id" label="学校编号" width="auto" show-overflow-tooltip></el-table-column>
+        <!-- <el-table-column prop="jxjd_sm_id" label="学校编号" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column prop="jxjd_jczcy" label="检查组成员" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxjd_jczcy_json" label="检查组成员JSON" width="auto" show-overflow-tooltip></el-table-column>
+        <!-- <el-table-column prop="jxjd_jczcy_json" label="检查组成员JSON" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column prop="jxjd_jczyj" label="检查组意见" width="auto" show-overflow-tooltip></el-table-column>
         <el-table-column prop="jxj_xxknjwt" label="学校困难及问题" width="auto" show-overflow-tooltip></el-table-column>
         <el-table-column label="操作" fixed="right">
           <template #default="scope">
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="text">编辑</el-button>
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="text">详情</el-button>
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="text">删除</el-button>
+            <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="text">编辑</el-button> -->
+            <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="text">详情
+            </el-button>
+            <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="text">删除
+            </el-button> -->
           </template>
         </el-table-column>
       </el-table>
@@ -299,15 +349,35 @@
 
     <el-dialog :visible.sync="dialogVisible_addOrEdit" append-to-body destroy-on-close>
       <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit"
-        label-width="120px">
-        <el-form-item label="检查任务名称" prop="jxjd_name"><el-input v-model="dialogForm_Data.jxjd_name" clearable /></el-form-item>
-        <el-form-item label="检查任务编号" prop="jxj_id"><el-input v-model="dialogForm_Data.jxj_id" clearable /></el-form-item>
-        <el-form-item label="学校名称" prop="jxjd_sm_name"><el-input v-model="dialogForm_Data.jxjd_sm_name" clearable /></el-form-item>
-        <el-form-item label="学校编号" prop="jxjd_sm_id"><el-input v-model="dialogForm_Data.jxjd_sm_id" clearable /></el-form-item>
-        <el-form-item label="检查组成员" prop="jxjd_jczcy"><el-input v-model="dialogForm_Data.jxjd_jczcy" clearable /></el-form-item>
-        <el-form-item label="检查组成员JSON" prop="jxjd_jczcy_json"><el-input v-model="dialogForm_Data.jxjd_jczcy_json" type="textarea" /></el-form-item>
-        <el-form-item label="检查组意见" prop="jxjd_jczyj"><el-input v-model="dialogForm_Data.jxjd_jczyj" type="textarea" /></el-form-item>
-        <el-form-item label="学校困难及问题" prop="jxj_xxknjwt"><el-input v-model="dialogForm_Data.jxj_xxknjwt" type="textarea" /></el-form-item>
+        label-width="140px">
+        <el-form-item label="检查任务名称" prop="jxjd_name">
+          <!-- <el-input v-model="dialogForm_Data.jxjd_name" clearable /> -->
+          <RemoteSelect v-model="dialogForm_Data.jxj_id" :label.sync="dialogForm_Data.jxjd_name"
+            url="/jdbg/xxgzjc_jcrw/index" field="jxj_id,jxj_title" />
+        </el-form-item>
+        <!-- <el-form-item label="检查任务编号" prop="jxj_id">
+          <el-input v-model="dialogForm_Data.jxj_id" clearable />
+        </el-form-item> -->
+        <el-form-item label="学校名称" prop="jxjd_sm_obj">
+          <!-- <el-input v-model="dialogForm_Data.jxjd_sm_name" clearable /> -->
+          <el-cascader class="w-full" v-model="dialogForm_Data.jxjd_sm_obj" filterable reserve-keyword clearable
+            :props="{ checkStrictly: true, emitPath: false }" :options="orgTree" :show-all-levels="false" />
+        </el-form-item>
+        <!-- <el-form-item label="学校编号" prop="jxjd_sm_id">
+          <el-input v-model="dialogForm_Data.jxjd_sm_id" clearable />
+        </el-form-item> -->
+        <el-form-item label="检查组成员" prop="jxjd_jczcy">
+          <el-input v-model="dialogForm_Data.jxjd_jczcy" clearable />
+        </el-form-item>
+        <!-- <el-form-item label="检查组成员JSON" prop="jxjd_jczcy_json">
+          <el-input v-model="dialogForm_Data.jxjd_jczcy_json" type="textarea" />
+        </el-form-item> -->
+        <el-form-item label="检查组意见" prop="jxjd_jczyj">
+          <el-input v-model="dialogForm_Data.jxjd_jczyj" type="textarea" :rows="6" />
+        </el-form-item>
+        <el-form-item label="学校困难及问题" prop="jxj_xxknjwt">
+          <el-input v-model="dialogForm_Data.jxj_xxknjwt" type="textarea" :rows="6" />
+        </el-form-item>
         <div class="flex justify-center">
           <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_addOrEdit')" type="primary">提交
           </el-button>

+ 57 - 0
src/views/xxgzjc/tjtj/components/pie.vue

@@ -0,0 +1,57 @@
+<script >
+import * as echarts from 'echarts'
+import { defineComponent, ref, getCurrentInstance, reactive, onMounted } from "@vue/composition-api";
+export default defineComponent({
+  props: ['d'],
+  setup(props) {
+    const d = props.d
+    const chartRef = ref()
+    onMounted(() => {
+      echarts.init(chartRef.value).setOption({
+        // tooltip: {
+        //   trigger: 'item',
+        //   formatter: '{b}: {c} ({d}%)',
+        // },
+        // legend: {
+        //   top: '5%',
+        //   left: 'center',
+        // },
+        color: ['#0036ff', '#c2c2c2'],
+        series: [
+          {
+            type: 'pie',
+            radius: ['40px', '86px'],
+            avoidLabelOverlap: false,
+            label: {
+              color: '#000',
+              formatter: (params) => {
+                // console.log('params :>> ', params);
+                return `${params.data.name}: ${params.data.value} (${params.percent}%)\n${d[params.data.type].reduce((p, { name }) => p += `${name}\n`, '')}`
+              },
+              lineHeight:18
+            },
+            // labelLine: {
+            //   show: true,
+            //   length: 10,
+            // },
+            data: [
+              { value: d.finish.length, name: '已提交单位', type: 'finish' },
+              { value: d.unfinish.length, name: '未提交单位', type: 'unfinish' },
+            ],
+          },
+        ],
+      })
+    })
+
+    return {
+      chartRef
+    }
+  }
+})
+
+
+</script>
+
+<template>
+  <div ref="chartRef" class="w-full h-full " />
+</template>

+ 118 - 63
src/views/xxgzjc/tjtj/detail.vue

@@ -1,48 +1,80 @@
 <script>
-  import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
-  import request from '~/utils/request';
-  import { Message } from 'element-ui'
-
-  export default defineComponent({
-    props: ['id'],
-    setup() {
-      // #region (constant)
-      const TABLE_KEY = 'jxj_id'
-      const URL_CUT = '/jdbg/xxgzjc_jcrw'
-      // #endregion
-
-
-        // #region (variable)
-        const loading = ref(true)
-        // #endregion
-
-
-            function detailApi() {
-              return request({
-                url: URL_CUT + '/detail',
-                data: {
-                  [TABLE_KEY]: props.id,
-                }
-              })
-            }
-
-            const detail_Data = ref()
-
-            // #region (page init)
-            async function init() {
-              const res = await detailApi(props.id)
-  detail_Data.value = (res.data.one_info)
-  loading.value = false
-}
-  init()
-  // #endregion
-
-  return {
-    loading,
-    detail_Data
-  }
+import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
+import request from '~/utils/request';
+import { Message } from 'element-ui'
+import pie from './components/pie.vue';
+
+export default defineComponent({
+  props: ['id'],
+  components: { pie },
+  setup(props) {
+    // #region (constant)
+    const TABLE_KEY = 'jxj_id'
+    const URL_CUT = '/jdbg/xxgzjc_jcrw'
+    // #endregion
+
+
+    // #region (variable)
+    const loading = ref(true)
+    // #endregion
+
+
+    function detailApi() {
+      return request({
+        url: URL_CUT + '/detail',
+        data: {
+          [TABLE_KEY]: props.id,
+        }
+      })
+    }
+
+    const detail_Data = ref()
+
+    // #region (page init)
+    async function init() {
+      const res = await detailApi(props.id)
+      detail_Data.value = (res.data.one_info)
+      loading.value = false
+    }
+    init()
+    // #endregion
+
+    const loading_table = ref(false)
+    const tableData = ref([])
+    const multipleSelection = ref([])
+    const handleSelectionChange = (val) => {
+      multipleSelection.value = val
+    }
+    function handleTableColBtn_detail(scope) {
+
+    }
+
+
+    function handleRemind() {
+      request({
+        url: '/jdbg/xxgzjc_jcrw/send',
+        data: {
+          jxj_id: props.id
+        }
+      }).then(res => {
+        if (res.code === '1') {
+          Message.success('已提醒')
+        }
+      })
+    }
+    return {
+      loading,
+      detail_Data,
+
+      loading_table,
+      tableData,
+      handleSelectionChange,
+      handleTableColBtn_detail,
+
+      handleRemind
     }
-  })
+  }
+})
 
 
 
@@ -50,36 +82,59 @@
 </script>
 
 <template>
-  <div :loading="loading">
+  <div :loading="loading" class="text-sm p-6">
     <template v-if="detail_Data">
       <div class="flex">
-        <div>检查任务标题</div>
-        <div>{{detail_Data.jxj_title}}</div>
+        <!-- <div>检查任务标题</div> -->
+        <div class="text-2xl">{{ detail_Data.jxj_title }}</div>
       </div>
-      <div class="flex">
+      <div class="flex min-h-300px">
+        <div class="w-3/5">
+          <!-- <div class="flex">
         <div>发起人</div>
-        <div>{{detail_Data.jxj_fqr}}</div>
-      </div>
-      <div class="flex">
-        <div>完成时间</div>
-        <div>{{detail_Data.jxj_wcsj}}</div>
-      </div>
-      <div class="flex">
+        <div>{{ detail_Data.jxj_fqr }}</div>
+      </div> -->
+          <div class="flex mt-6">
+            <div>任务结束时间</div>
+            <div class="text-hex-969696 ml-3">{{ detail_Data.jxj_wcsj }}</div>
+          </div>
+          <!-- <div class="flex">
         <div>完成情况</div>
-        <div>{{detail_Data.jxj_wcqk}}</div>
-      </div>
-      <div class="flex">
-        <div>检查任务内容</div>
-        <div>{{detail_Data.jxj_content}}</div>
-      </div>
-      <div class="flex">
+        <div>{{ detail_Data.jxj_wcqk }}</div>
+      </div> -->
+          <div class="flex mt-8">
+            <!-- <div>检查任务内容</div> -->
+            <div class="text-base text-hex-AEAEAE">{{ detail_Data.jxj_content }}</div>
+          </div>
+          <!-- <div class="flex">
         <div>下发对象JSON</div>
-        <div>{{detail_Data.jxj_xfdx_json}}</div>
+        <div>{{ detail_Data.jxj_xfdx_json }}</div>
       </div>
       <div class="flex">
         <div>归档状态</div>
-        <div>{{detail_Data.jxj_id}}</div>
+        <div>{{ detail_Data.jxj_id }}</div>
+      </div> -->
+        </div>
+        <div class="flex flex-col items-end">
+          <el-button @click="handleRemind" type="primary">提醒</el-button>
+          <pie class="w-2/5 min-w-600px h-300px" :d="detail_Data.progress" />
+        </div>
       </div>
+
+      <el-divider></el-divider>
+      <el-table :data="tableData" @selection-change="handleSelectionChange" v-loading="loading_table"
+        element-loading-background="#ffffff70">
+        <el-table-column type="selection"></el-table-column>
+        <el-table-column prop="jxj_title" label="文件" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="jxj_fqr" label="上传者" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="jxj_wcsj" label="时间" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column label="操作" fixed="right">
+          <template #default="scope">
+            <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="text">详情
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
     </template>
   </div>
 

+ 219 - 165
src/views/xxgzjc/tjtj/index.vue

@@ -1,11 +1,12 @@
 <script>
-  import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
-  import request from '~/utils/request';
-  import { Message } from 'element-ui'
-
-  export default defineComponent({
-    props: [],
-    setup(props){
+import { defineComponent, ref, getCurrentInstance, reactive } from "@vue/composition-api";
+import request from '~/utils/request';
+import { Message } from 'element-ui'
+import { user } from '~/stores/user'
+
+export default defineComponent({
+  props: [],
+  setup(props) {
     const _this = getCurrentInstance().proxy;
     // #region (constant)
     const TABLE_KEY = 'jxj_id'
@@ -24,21 +25,21 @@
     // #region (type)
     // type TYPE_TABLE_FIELD = {
     //   [TABLE_KEY]: string;
-    //   
+    //
     //   'jxj_title': string; // 检查任务标题
-    //   
+    //
     //   'jxj_fqr': string; // 发起人
-    //   
+    //
     //   'jxj_wcsj': string; // 完成时间
-    //   
+    //
     //   'jxj_wcqk': string; // 完成情况
-    //   
+    //
     //   'jxj_content': string; // 检查任务内容
-    //   
+    //
     //   'jxj_xfdx_json': string; // 下发对象JSON
-    //   
+    //
     //   'jxj_id': string; // 归档状态
-    //   
+    //
     // }
     // #endregion
 
@@ -48,177 +49,201 @@
     const handleQueryFormBtn_search = () => {
       queryApi()
     }
-      // #endregion
+    // #endregion
 
-      // #region (table selection)
-      const multipleSelection = ref([])
-      const handleSelectionChange = (val) => {
-        multipleSelection.value = val
-      }
-      // #endregion
+    // #region (table selection)
+    const multipleSelection = ref([])
+    const handleSelectionChange = (val) => {
+      multipleSelection.value = val
+    }
+    // #endregion
 
-      // #region (table row)
-      const handleTableRowBtn_add = () => {
+    // #region (table row)
+    const handleTableRowBtn_add = () => {
       whichDialogSubmit = 'add'
       dialogForm_Data.value = {}
       dialogVisible_addOrEdit.value = true
     }
-      const handleTableRowBtn_delete = async () => {
-      await deleteApi(multipleSelection.value.map((item)=>item[TABLE_KEY]))
+    const handleTableRowBtn_delete = async () => {
+      await deleteApi(multipleSelection.value.map((item) => item[TABLE_KEY]))
       queryApi()
     }
-        // #endregion
+    // #endregion
 
-        // #region (table body)
-        const tableData = ref([])
-        const DetailName = '-XXGZJC-TJTJ-DETAIL'
-        const DetailParam = 'aid'
+    // #region (table body)
+    const tableData = ref([])
+    const DetailName = 'XXGZJC_TJTJ_DETAIL'
+    const DetailParam = 'id'
 
-        const handleTableColBtn_edit = async (scope) => {
+    const handleTableColBtn_edit = async (scope) => {
       whichDialogSubmit = 'edit'
       const res = await detailApi(scope.row[TABLE_KEY])
       dialogForm_Data.value = (res.data.one_info)
       dialogVisible_addOrEdit.value = true
     }
-        const handleTableColBtn_detail = (scope) => {
-      instance.$router.push({ name:DetailName, params:{ [DetailParam]:scope.row[TABLE_KEY]} })
+    const handleTableColBtn_detail = (scope) => {
+      instance.$router.push({ name: DetailName, params: { [DetailParam]: scope.row[TABLE_KEY] } })
     }
-        const handleTableColBtn_delete = async (scope) => {
+    const handleTableColBtn_delete = async (scope) => {
       await deleteApi(scope.row[TABLE_KEY])
       queryApi()
     }
-          // #endregion
+    // #endregion
 
-          // #region (pagination)
-          const total = ref(0)
-          const limit = ref(10)
+    // #region (pagination)
+    const total = ref(0)
+    const limit = ref(10)
 
-          const currentPage = ref(1)
-          function handleCurrentChange() {
-            queryApi()
-          }
-          // #endregion
+    const currentPage = ref(1)
+    function handleCurrentChange() {
+      queryApi()
+    }
+    // #endregion
 
-          // #region (dialog base)
-          const dialogForm_Data = ref({})
+    // #region (dialog base)
+    const dialogForm_Data = ref({})
 
-          const handleDialogFormBtn_submit = async (formRefKey,extendData) => {
+    const handleDialogFormBtn_submit = async (formRefKey, extendData) => {
       const isValid = await (instance?.$refs[formRefKey]).validate()
       if (isValid) {
-        await API_MAP[whichDialogSubmit](({...dialogForm_Data.value,...extendData}))
+        await API_MAP[whichDialogSubmit](({ ...dialogForm_Data.value, ...extendData,jxj_xfdx_json:dialogForm_Data.value.jxj_xfdx_json?.join() }))
         handleDialogFormBtn_cancel()
         queryApi()
       }
     }
-          const handleDialogFormBtn_cancel = (formRefKey) => {
+    const handleDialogFormBtn_cancel = (formRefKey) => {
       dialogVisible_addOrEdit.value = false
     }
-            // #endregion
-
-            // #region (dialog add/edit)
-            const dialogVisible_addOrEdit = ref(false)
-
-            const dialogForm_Ref_addOrEdit = ref()
-            const dialogForm_Rules_addOrEdit = reactive({
-          'jxj_title': { required: true, message: '检查任务标题不能为空', trigger: 'submit' },
-          'jxj_fqr': { required: true, message: '发起人不能为空', trigger: 'submit' },
-          'jxj_wcsj': { required: true, message: '完成时间不能为空', trigger: 'submit' },
-          'jxj_wcqk': { required: true, message: '完成情况不能为空', trigger: 'submit' },
-          'jxj_content': { required: true, message: '检查任务内容不能为空', trigger: 'submit' },
-          'jxj_xfdx_json': { required: true, message: '下发对象JSON不能为空', trigger: 'submit' },
-          'jxj_id': { required: true, message: '归档状态不能为空', trigger: 'submit' },
-            })
-            // #endregion
-
-            // #region (request api):
-            function queryApi() {
-              loading_table.value = true
-              return request({
-                url: URL_CUT + '/index',
-                data: {
-                  ...queryForm_Data.value,
-                  limit: limit.value,
-                  page: currentPage.value
-                }
-              }).then((response) => {
-                const { data } = response
-                total.value = parseInt(data.total_rows)
-                tableData.value = data.page_data
-                return response
-              }).then(() => {
-                loading_table.value = false
-              })
-            }
-
-            function addApi(data) {
-              return request({
-                url: URL_CUT + '/add',
-                data: {
-                  [URL_SUBMIT_KEY]: data,
-                }
-              })
-            }
-
-            function editApi(data) {
-              return request({
-                url: URL_CUT + '/edit',
-                data: {
-                  [TABLE_KEY]: data[TABLE_KEY],
-                  [URL_SUBMIT_KEY]:{},
-        }
-          })
-        }
+    // #endregion
+
+    // #region (dialog add/edit)
+    const dialogVisible_addOrEdit = ref(false)
+
+    const dialogForm_Ref_addOrEdit = ref()
+    const dialogForm_Rules_addOrEdit = reactive({
+      'jxj_title': { required: true, message: '检查任务标题不能为空', trigger: 'submit' },
+      'jxj_fqr': { required: true, message: '发起人不能为空', trigger: 'submit' },
+      'jxj_wcsj': { required: true, message: '完成时间不能为空', trigger: 'submit' },
+      'jxj_wcqk': { required: true, message: '完成情况不能为空', trigger: 'submit' },
+      'jxj_content': { required: true, message: '检查任务内容不能为空', trigger: 'submit' },
+      'jxj_xfdx_json': { required: true, message: '下发对象JSON不能为空', trigger: 'submit' },
+      'jxj_id': { required: true, message: '归档状态不能为空', trigger: 'submit' },
+    })
+    // #endregion
 
-        function deleteApi(id) {
-          return request({
-            url: URL_CUT + '/delete',
-            data: {
-              [TABLE_KEY]: id,
-            }
-          })
+    // #region (request api):
+    function queryApi() {
+      loading_table.value = true
+      return request({
+        url: URL_CUT + '/index',
+        data: {
+          ...queryForm_Data.value,
+          limit: limit.value,
+          page: currentPage.value
         }
+      }).then((response) => {
+        const { data } = response
+        total.value = parseInt(data.total_rows)
+        tableData.value = data.page_data
+        return response
+      }).then(() => {
+        loading_table.value = false
+      })
+    }
 
-        function detailApi(id) {
-          return request({
-            url: URL_CUT + '/detail',
-            data: {
-              [TABLE_KEY]: id,
-            }
-          })
+    function addApi(data) {
+      return request({
+        url: URL_CUT + '/add',
+        data: {
+          [URL_SUBMIT_KEY]: { ...data, jxj_fqr: user.real_name },
         }
+      })
+    }
 
-        function importApi(data) {
-          return request({
-            $type: 'import',
-            url: URL_CUT + '/import',
-            data
-          })
+    function editApi(data) {
+      return request({
+        url: URL_CUT + '/edit',
+        data: {
+          [TABLE_KEY]: data[TABLE_KEY],
+          [URL_SUBMIT_KEY]: {},
         }
+      })
+    }
 
-        function exportApi() {
-          return download(URL_CUT + '/index', queryForm_Data.value)
+    function deleteApi(id) {
+      return request({
+        url: URL_CUT + '/delete',
+        data: {
+          [TABLE_KEY]: id,
         }
+      })
+    }
 
-        const API_MAP = {
-          query: queryApi,
-          add: addApi,
-          edit: editApi,
-          delete: deleteApi,
-          detail: detailApi,
-          import: importApi,
-          export: exportApi,
+    function detailApi(id) {
+      return request({
+        url: URL_CUT + '/detail',
+        data: {
+          [TABLE_KEY]: id,
         }
-        // #endregion
+      })
+    }
+
+    function importApi(data) {
+      return request({
+        $type: 'import',
+        url: URL_CUT + '/import',
+        data
+      })
+    }
 
-        // #region (page init)
-        function init() {
-          queryApi()
+    function exportApi() {
+      return download(URL_CUT + '/index', queryForm_Data.value)
+    }
+
+    const API_MAP = {
+      query: queryApi,
+      add: addApi,
+      edit: editApi,
+      delete: deleteApi,
+      detail: detailApi,
+      import: importApi,
+      export: exportApi,
+    }
+    // #endregion
+
+    // #region (page init)
+    function init() {
+      queryApi()
+    }
+    init()
+    // #endregion
+
+    function handleTree(list) {
+      return list.map(item => {
+        const obj = Object.assign({
+          value: `${item.id}|${item.label}`
+        }, item)
+        if (item.children) {
+          obj.children = handleTree(item.children)
         }
-        init()
-        // #endregion
+        return obj
+      })
 
-        return {
-          queryForm_Data,
+    }
+
+    let orgTree = ref()
+    const cascaderRef = ref()
+    request({
+      url: '/user/org/list_tree'
+    }).then(res => {
+      if (res.code === '1') {
+        orgTree.value = handleTree(res.data.one_info)
+        console.log('orgTree :>> ', orgTree.value);
+      }
+    })
+
+    return {
+      queryForm_Data,
       loading_table,
       tableData,
       dialogVisible_addOrEdit,
@@ -237,32 +262,37 @@
       handleSelectionChange,
       handleTableRowBtn_delete,
       handleDialogFormBtn_submit,
-      handleDialogFormBtn_cancel
-        }
-      }
-    })
+      handleDialogFormBtn_cancel,
+
+      orgTree,
+      cascaderRef
+    }
+  }
+})
 </script>
 
 
 <template>
   <div class="card flex-grow flex flex-col">
     <el-form inline :model="queryForm_Data">
-      <!-- <el-form-item label="关键字"><el-input v-model="queryForm_Data.keyword" ></el-input></el-form-item> -->
-      <el-form-item label="检查任务标题"><el-input v-model="queryForm_Data.jxj_title" clearable /></el-form-item>
+      <el-form-item label="关键字">
+        <el-input v-model="queryForm_Data.keyword"></el-input>
+      </el-form-item>
+      <!-- <el-form-item label="检查任务标题"><el-input v-model="queryForm_Data.jxj_title" clearable /></el-form-item>
       <el-form-item label="发起人"><el-input v-model="queryForm_Data.jxj_fqr" clearable /></el-form-item>
-      <el-form-item label="完成时间"><el-date-picker type="date" v-model="queryForm_Data.jxj_wcsj" value-format="YYYY-MM-DD" clearable /></el-form-item>
+      <el-form-item label="完成时间"><el-date-picker type="date" v-model="queryForm_Data.jxj_wcsj" value-format="yyyy-MM-DD" clearable /></el-form-item>
       <el-form-item label="完成情况"><el-input v-model="queryForm_Data.jxj_wcqk" clearable /></el-form-item>
       <el-form-item label="检查任务内容"><el-input v-model="queryForm_Data.jxj_content" type="textarea" /></el-form-item>
       <el-form-item label="下发对象JSON"><el-input v-model="queryForm_Data.jxj_xfdx_json" type="textarea" /></el-form-item>
-      <el-form-item label="归档状态"><el-select v-model="queryForm_Data.jxj_id" clearable filterable ><el-option label="是" value="1" /><el-option label="否" value="2" /></el-select></el-form-item>
+      <el-form-item label="归档状态"><el-select v-model="queryForm_Data.jxj_id" clearable filterable ><el-option label="是" value="1" /><el-option label="否" value="2" /></el-select></el-form-item> -->
       <el-form-item>
         <el-button @click="handleQueryFormBtn_search" type="primary">搜索</el-button>
       </el-form-item>
     </el-form>
     <div class="divider"></div>
     <div>
-      <el-button @click="handleTableRowBtn_add" type="primary">新</el-button>
-      <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button>
+      <el-button @click="handleTableRowBtn_add" type="primary">新建检查任务</el-button>
+      <!-- <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button> -->
     </div>
 
     <div class="divider"></div>
@@ -273,15 +303,20 @@
         <el-table-column prop="jxj_title" label="检查任务标题" width="auto" show-overflow-tooltip></el-table-column>
         <el-table-column prop="jxj_fqr" label="发起人" width="auto" show-overflow-tooltip></el-table-column>
         <el-table-column prop="jxj_wcsj" label="完成时间" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxj_wcqk" label="完成情况" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxj_content" label="检查任务内容" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="jxj_wcqk" label="完成情况" width="auto" show-overflow-tooltip>
+          <template #default="scope">
+            <el-progress :percentage="scope.row.jxj_wcqk * 1"></el-progress>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column prop="jxj_content" label="检查任务内容" width="auto" show-overflow-tooltip></el-table-column>
         <el-table-column prop="jxj_xfdx_json" label="下发对象JSON" width="auto" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="jxj_id" label="归档状态" width="auto" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="jxj_id" label="归档状态" width="auto" show-overflow-tooltip></el-table-column> -->
         <el-table-column label="操作" fixed="right">
           <template #default="scope">
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="text">编辑</el-button>
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="text">详情</el-button>
-            <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="text">删除</el-button>
+            <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="text">编辑</el-button> -->
+            <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="text">详情
+            </el-button>
+            <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="text">删除</el-button> -->
           </template>
         </el-table-column>
       </el-table>
@@ -295,13 +330,32 @@
     <el-dialog :visible.sync="dialogVisible_addOrEdit" append-to-body destroy-on-close>
       <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit"
         label-width="120px">
-        <el-form-item label="检查任务标题" prop="jxj_title"><el-input v-model="dialogForm_Data.jxj_title" clearable /></el-form-item>
-        <el-form-item label="发起人" prop="jxj_fqr"><el-input v-model="dialogForm_Data.jxj_fqr" clearable /></el-form-item>
-        <el-form-item label="完成时间" prop="jxj_wcsj"><el-date-picker type="date" v-model="dialogForm_Data.jxj_wcsj" value-format="YYYY-MM-DD" clearable /></el-form-item>
-        <el-form-item label="完成情况" prop="jxj_wcqk"><el-input v-model="dialogForm_Data.jxj_wcqk" clearable /></el-form-item>
-        <el-form-item label="检查任务内容" prop="jxj_content"><el-input v-model="dialogForm_Data.jxj_content" type="textarea" /></el-form-item>
-        <el-form-item label="下发对象JSON" prop="jxj_xfdx_json"><el-input v-model="dialogForm_Data.jxj_xfdx_json" type="textarea" /></el-form-item>
-        <el-form-item label="归档状态" prop="jxj_id"><el-radio-group v-model="dialogForm_Data.jxj_id"><el-radio label="1">是</el-radio><el-radio label="2">否</el-radio></el-radio-group></el-form-item>
+        <el-form-item label="检查任务标题" prop="jxj_title">
+          <el-input v-model="dialogForm_Data.jxj_title" clearable />
+        </el-form-item>
+        <!-- <el-form-item label="发起人" prop="jxj_fqr">
+          <el-input v-model="dialogForm_Data.jxj_fqr" clearable />
+        </el-form-item> -->
+        <el-form-item label="完成时间" prop="jxj_wcsj">
+          <el-date-picker type="date" v-model="dialogForm_Data.jxj_wcsj" value-format="yyyy-MM-DD" clearable />
+        </el-form-item>
+        <!-- <el-form-item label="完成情况" prop="jxj_wcqk">
+          <el-input v-model="dialogForm_Data.jxj_wcqk" clearable />
+        </el-form-item> -->
+        <el-form-item label="检查任务内容" prop="jxj_content">
+          <el-input v-model="dialogForm_Data.jxj_content" type="textarea" :rows="6" />
+        </el-form-item>
+        <el-form-item label="下发对象" prop="jxj_xfdx_json">
+          <el-cascader ref="cascaderRef" class="w-full" v-model="dialogForm_Data.jxj_xfdx_json" filterable
+            reserve-keyword clearable :props="{ checkStrictly: true, multiple: true, emitPath: false }" :options="orgTree"
+            :show-all-levels="false" />
+        </el-form-item>
+        <!-- <el-form-item label="归档状态" prop="jxj_id">
+          <el-radio-group v-model="dialogForm_Data.jxj_id">
+            <el-radio label="1">是</el-radio>
+            <el-radio label="2">否</el-radio>
+          </el-radio-group>
+        </el-form-item> -->
         <div class="flex justify-center">
           <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_addOrEdit')" type="primary">提交
           </el-button>

+ 10 - 10
src/views/xxgzjc/zlgd/index.vue

@@ -24,21 +24,21 @@
     // #region (type)
     // type TYPE_TABLE_FIELD = {
     //   [TABLE_KEY]: string;
-    //   
+    //
     //   'jxj_title': string; // 检查任务标题
-    //   
+    //
     //   'jxj_fqr': string; // 发起人
-    //   
+    //
     //   'jxj_wcsj': string; // 完成时间
-    //   
+    //
     //   'jxj_wcqk': string; // 完成情况
-    //   
+    //
     //   'jxj_content': string; // 检查任务内容
-    //   
+    //
     //   'jxj_xfdx_json': string; // 下发对象JSON
-    //   
+    //
     //   'jxj_id': string; // 归档状态
-    //   
+    //
     // }
     // #endregion
 
@@ -250,7 +250,7 @@
       <!-- <el-form-item label="关键字"><el-input v-model="queryForm_Data.keyword" ></el-input></el-form-item> -->
       <el-form-item label="检查任务标题"><el-input v-model="queryForm_Data.jxj_title" clearable /></el-form-item>
       <el-form-item label="发起人"><el-input v-model="queryForm_Data.jxj_fqr" clearable /></el-form-item>
-      <el-form-item label="完成时间"><el-date-picker type="date" v-model="queryForm_Data.jxj_wcsj" value-format="YYYY-MM-DD" clearable /></el-form-item>
+      <el-form-item label="完成时间"><el-date-picker type="date" v-model="queryForm_Data.jxj_wcsj" value-format="yyyy-MM-DD" clearable /></el-form-item>
       <el-form-item label="完成情况"><el-input v-model="queryForm_Data.jxj_wcqk" clearable /></el-form-item>
       <el-form-item label="检查任务内容"><el-input v-model="queryForm_Data.jxj_content" type="textarea" /></el-form-item>
       <el-form-item label="下发对象JSON"><el-input v-model="queryForm_Data.jxj_xfdx_json" type="textarea" /></el-form-item>
@@ -297,7 +297,7 @@
         label-width="120px">
         <el-form-item label="检查任务标题" prop="jxj_title"><el-input v-model="dialogForm_Data.jxj_title" clearable /></el-form-item>
         <el-form-item label="发起人" prop="jxj_fqr"><el-input v-model="dialogForm_Data.jxj_fqr" clearable /></el-form-item>
-        <el-form-item label="完成时间" prop="jxj_wcsj"><el-date-picker type="date" v-model="dialogForm_Data.jxj_wcsj" value-format="YYYY-MM-DD" clearable /></el-form-item>
+        <el-form-item label="完成时间" prop="jxj_wcsj"><el-date-picker type="date" v-model="dialogForm_Data.jxj_wcsj" value-format="yyyy-MM-DD" clearable /></el-form-item>
         <el-form-item label="完成情况" prop="jxj_wcqk"><el-input v-model="dialogForm_Data.jxj_wcqk" clearable /></el-form-item>
         <el-form-item label="检查任务内容" prop="jxj_content"><el-input v-model="dialogForm_Data.jxj_content" type="textarea" /></el-form-item>
         <el-form-item label="下发对象JSON" prop="jxj_xfdx_json"><el-input v-model="dialogForm_Data.jxj_xfdx_json" type="textarea" /></el-form-item>

+ 14 - 9
yarn.lock

@@ -773,13 +773,13 @@ dijkstrajs@^1.0.1:
   resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257"
   integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==
 
-echarts@^5.3.2:
-  version "5.3.2"
-  resolved "https://registry.npmjs.org/echarts/-/echarts-5.3.2.tgz"
-  integrity sha512-LWCt7ohOKdJqyiBJ0OGBmE9szLdfA9sGcsMEi+GGoc6+Xo75C+BkcT/6NNGRHAWtnQl2fNow05AQjznpap28TQ==
+echarts@^5.4.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/echarts/-/echarts-5.4.0.tgz#a9a8e5367293a397408d3bf3e2638b869249ce04"
+  integrity sha512-uPsO9VRUIKAdFOoH3B0aNg7NRVdN7aM39/OjovjO9MwmWsAkfGyeXJhK+dbRi51iDrQWliXV60/XwLA7kg3z0w==
   dependencies:
     tslib "2.3.0"
-    zrender "5.3.1"
+    zrender "5.4.0"
 
 electron-to-chromium@^1.4.76:
   version "1.4.82"
@@ -1162,6 +1162,11 @@ locate-path@^5.0.0:
   dependencies:
     p-locate "^4.1.0"
 
+lodash-es@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
 lodash.kebabcase@^4.1.1:
   version "4.1.1"
   resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz"
@@ -1751,9 +1756,9 @@ yargs@^15.3.1:
     y18n "^4.0.0"
     yargs-parser "^18.1.2"
 
-zrender@5.3.1:
-  version "5.3.1"
-  resolved "https://registry.npmjs.org/zrender/-/zrender-5.3.1.tgz"
-  integrity sha512-7olqIjy0gWfznKr6vgfnGBk7y4UtdMvdwFmK92vVQsQeDPyzkHW1OlrLEKg6GHz1W5ePf0FeN1q2vkl/HFqhXw==
+zrender@5.4.0:
+  version "5.4.0"
+  resolved "https://registry.yarnpkg.com/zrender/-/zrender-5.4.0.tgz#d4f76e527b2e3bbd7add2bdaf27a16af85785576"
+  integrity sha512-rOS09Z2HSVGFs2dn/TuYk5BlCaZcVe8UDLLjj1ySYF828LATKKdxuakSZMvrDz54yiKPDYVfjdKqcX8Jky3BIA==
   dependencies:
     tslib "2.3.0"