WINDOWS-7IFQK7E\EDY 1 год назад
Родитель
Сommit
5d8b99b3de
40 измененных файлов с 6539 добавлено и 4009 удалено
  1. 1 0
      package.json
  2. 4765 3636
      pnpm-lock.yaml
  3. 15 0
      public/auto-login.html
  4. 2 2
      public/config.js
  5. BIN
      public/loading.gif
  6. BIN
      src/assets/index/jslswc.png
  7. BIN
      src/assets/index/jylb.png
  8. BIN
      src/assets/index/xclb.png
  9. 56 0
      src/pages/administrativeService/teacherTempGoOut/dateTImePicker.vue
  10. 135 0
      src/pages/administrativeService/teacherTempGoOut/index.vue
  11. 6 0
      src/pages/borrowReceive/borrowList/index.vue
  12. 6 0
      src/pages/borrowReceive/schoolPropertyList/index.vue
  13. 1 0
      src/pages/equipmentPurchaseApply/budgetOfPlant/myAuditFor/index.vue
  14. 25 9
      src/pages/menuData.js
  15. 11 2
      src/pages/officialDocumentManager/documentLibrary/detail/documentDetail/index.vue
  16. 5 19
      src/pages/officialDocumentManager/documentLibrary/index.vue
  17. 9 2
      src/pages/officialDocumentManager/myOfficialDocument/detail/index.vue
  18. 24 11
      src/pages/officialDocumentManager/todoOffcialDoucument/detail/index.vue
  19. 9 2
      src/pages/officialDocumentManager/todoReadDoucument/detail/index.vue
  20. 8 1
      src/pages/officialDocumentManager/todoReadDoucument/index.vue
  21. 224 159
      src/pages/projectManager/projectDatabase/detail/index.vue
  22. 1 1
      src/pages/projectManager/projectManageControl/detail/index.vue
  23. 150 0
      src/pages/reserveMeetingRooms/detail/index.vue
  24. 17 0
      src/pages/reserveMeetingRooms/index.vue
  25. 104 0
      src/pages/reserveMeetingRooms/myAttendFor/index.vue
  26. 104 0
      src/pages/reserveMeetingRooms/myInitiateFor/index.vue
  27. 64 29
      src/pages/sanZhongYiDa/projectApply/detail/index.vue
  28. 35 55
      src/pages/sanZhongYiDa/projectApply/myAuditFor/index.vue
  29. 6 19
      src/pages/sanZhongYiDa/projectApply/myAudited/index.vue
  30. 172 0
      src/pages/tdk/wdkb.vue
  31. 27 23
      src/pages/techerFlowManager/teacherPerformanceAssessment/detailMyApplyFor/index.vue
  32. 31 31
      src/pages/techerFlowManager/teacherPerformanceAssessment/detailMyAuditFor/index.vue
  33. 100 1
      src/store/local/la.js
  34. 90 0
      src/store/produ/la.js
  35. 102 0
      src/store/produ/lwj.js
  36. 97 0
      src/store/produ/zlh1388.js
  37. 97 0
      src/store/produ/zlh1391.js
  38. 9 7
      src/store/user.js
  39. 5 0
      src/styles/main.scss
  40. 26 0
      src/utils/index.js

+ 1 - 0
package.json

@@ -38,6 +38,7 @@
     "@vue/test-utils": "^2.3.2",
     "jsdom": "^22.0.0",
     "pnpm": "^8.5.1",
+    "qrcode": "^1.5.3",
     "simple-git-hooks": "^2.8.1",
     "taze": "^0.10.1",
     "typescript": "^5.0.4",

Разница между файлами не показана из-за своего большого размера
+ 4765 - 3636
pnpm-lock.yaml


+ 15 - 0
public/auto-login.html

@@ -117,6 +117,21 @@
                     dataType: "json",
                     success: (res) => {
                       if (res.code == 1) {
+                        const userInfo = res.data
+                        if ((!Array.isArray(userInfo.user_org.length)) && userInfo.user_org.length == 0) {
+                          alert('账号未绑定机构,您没有权限访问该应用')
+                          return
+                        }
+                        // uo_type 2是学校 1是教育局
+                        const uo_type = userInfo.user_org[userInfo.user_org.length - 1].uo_type
+                        if (uo_type == '1' && tag.startsWith('xd')) {
+                          alert('您是教育局用户,无法访问该应用')
+                          return
+                        }
+                        if (uo_type == '2' && tag.startsWith('jd')) {
+                          alert('您是学校用户,无法访问该应用')
+                          return
+                        }
                         localStorage.setItem('userInfo', JSON.stringify(res.data));
                         location.href = '/app/mobile/' + (tag ? ('#/?tag=' + tag) : '');
                       } else {

+ 2 - 2
public/config.js

@@ -27,9 +27,9 @@ const production = {
 
 function isWhich() {
   if (window.location.href.includes('localhost')) {
-    return local
+    return production
   } else if (window.location.href.includes('bozedu')) {
-    return development
+    return production
   } else {
     return production
   }

BIN
public/loading.gif


BIN
src/assets/index/jslswc.png


BIN
src/assets/index/jylb.png


BIN
src/assets/index/xclb.png


+ 56 - 0
src/pages/administrativeService/teacherTempGoOut/dateTImePicker.vue

@@ -0,0 +1,56 @@
+<script setup>
+
+const props = defineProps({
+  label: {
+    type: String,
+    default: '',
+  },
+})
+
+defineExpose({
+  getResult
+})
+function getResult() {
+  return result
+}
+let result = $ref('')
+let showDatePicker = $ref(false)
+let showTimePicker = $ref(false)
+
+const onDateConfirm = ({ selectedValues }) => {
+  result = selectedValues.join('/');
+  showDatePicker = false;
+  showTimePicker = true
+};
+const onTimeConfirm = ({ selectedValues }) => {
+  result = result + ' ' + selectedValues.join(':');
+  showTimePicker = false;
+};
+
+let oldResult = ''
+const clickPop = () => {
+  oldResult = result
+  showDatePicker = true
+}
+const clickCancel = () => {
+  result = oldResult
+  showDatePicker = false
+  showTimePicker = false
+
+}
+const currentTime = ref(['12', '00', '00']);
+const columnsType = ['hour', 'minute', 'second'];
+
+const minDate = new Date(2020, 0, 1)
+</script>
+<template>
+  <van-field v-model="result" is-link readonly name="datePicker" :label='props.label' placeholder="点击选择时间"
+    @click="clickPop" :rules="[{ required: true, message: '请选择时间' }]" />
+  <van-popup v-model:show="showDatePicker" position="bottom">
+    <van-date-picker :min-date="minDate" @confirm="onDateConfirm" @cancel="clickCancel" />
+  </van-popup>
+  <van-popup v-model:show="showTimePicker" position="bottom">
+    <van-time-picker @confirm="onTimeConfirm" @cancel="clickCancel" v-model="currentTime" title="选择时间"
+      :columns-type="columnsType" />
+  </van-popup>
+</template>

+ 135 - 0
src/pages/administrativeService/teacherTempGoOut/index.vue

@@ -0,0 +1,135 @@
+<script setup>
+import { userInfo } from "~/store/user";
+import dateTimePicker from './dateTImePicker.vue'
+import { showFailToast, showToast } from 'vant'
+
+const { uo_type } = userInfo;
+const isBureau = ref(false); // 当前用户是否局端
+isBureau.value = uo_type === "1";
+
+const router = useRouter()
+
+let transParams = $ref({
+  xxw_sqsj: '',
+  xxw_qjr: '',
+  xxw_wcmd: '',
+  xxw_kssj: '',
+  xxw_yjfhsj: '',
+  xxw_sjfhsj: '',
+  xxw_spr: '',
+  xxw_bz: ''
+})
+const sqsjRef = $ref()
+const kssjRef = $ref()
+const yjfhsjRef = $ref()
+const sjfhsjRef = $ref()
+const onSubmit = () => {
+  transParams.xxw_sqsj = sqsjRef.getResult()
+  transParams.xxw_kssj = kssjRef.getResult()
+  transParams.xxw_yjfhsj = yjfhsjRef.getResult()
+  transParams.xxw_sjfhsj = sjfhsjRef.getResult()
+  if (transParams.xxw_qjr === transParams.xxw_spr) {
+    showFailToast('请假人和审批人不能为同一人')
+    return
+  }
+  request({ url: '/xdbg/xzfw_wcgl/add', data: { xdbg_xzfw_wcgl: transParams } }).then(res => {
+    if (res.code == '1') {
+      showToast(res.msg);
+      router.go(0);
+    }
+  })
+};
+
+const dateResult = ref('');
+const showDatePicker = ref(false);
+const onDateConfirm = ({ selectedValues }) => {
+  dateResult.value = selectedValues.join('/');
+  showDatePicker.value = false;
+  showTimePicker.value = true
+};
+
+const currentTime = ref(['12', '00', '00']);
+const columnsType = ['hour', 'minute', 'second'];
+
+const timeResult = ref('');
+const showTimePicker = ref(false);
+const onTimeConfirm = ({ selectedValues }) => {
+  timeResult.value = selectedValues.join(':');
+  showTimePicker.value = false;
+};
+
+let userList = $ref([])
+const { dept_id } = userInfo;
+request({
+  url: '/user/main/index',
+  data: {
+    dept_id: dept_id,
+    all: '1',
+    page: 1,
+    limit: 99999
+  }
+}).then(res => {
+  if (res.code == 1) {
+    let tempArray = [];
+    res.data.page_data.forEach((item) => {
+      tempArray.push({
+        text: item.user_realname,
+        value: item.user_id,
+      });
+    });
+    userList = tempArray;
+  }
+})
+let qjr = $ref('')
+const showQjrUserPicker = ref(false);
+const onQjrUserConfirm = ({ selectedValues, selectedOptions }) => {
+  qjr = selectedOptions[0].text
+  transParams.xxw_qjr = selectedValues[0];
+  showQjrUserPicker.value = false;
+};
+
+let spr = $ref('')
+const showSprUserPicker = ref(false);
+const onSprUserConfirm = ({ selectedValues, selectedOptions }) => {
+  spr = selectedOptions[0].text
+  transParams.xxw_spr = selectedValues[0];
+  showSprUserPicker.value = false;
+};
+
+</script>
+<template>
+  <div v-show="isBureau">
+    <div style="width: 100%;text-align: center;"><span style="font-size: 20px;">本功能仅对校端用户开放</span></div>
+  </div>
+  <div v-show="!isBureau">
+    <van-form @submit="onSubmit">
+      <van-cell-group inset>
+        <dateTimePicker ref="sqsjRef" label="申请时间" />
+        <van-field v-model="qjr" is-link readonly name="picker" label="请假人" placeholder="请选择请假人"
+          @click="showQjrUserPicker = true" :rules="[{ required: true, message: '请选择请假人' }]" />
+        <van-popup v-model:show="showQjrUserPicker" position="bottom">
+          <van-picker :columns="userList" @confirm="onQjrUserConfirm" @cancel="showQjrUserPicker = false" />
+        </van-popup>
+        <dateTimePicker ref="kssjRef" label="开始时间" />
+        <dateTimePicker ref="yjfhsjRef" label="预计返回时间" />
+        <dateTimePicker ref="sjfhsjRef" label="实际返回时间" />
+        <van-field v-model="transParams.xxw_wcmd" name="外出目的" label="外出目的" placeholder="请输入外出目的"
+          :rules="[{ required: true, message: '请输入外出目的' }]" />
+        <van-field v-model="transParams.xxw_bz" name="备注" label="备注" placeholder="请输入备注"
+          :rules="[{ required: true, message: '请输入备注' }]" />
+
+        <van-field v-model="spr" is-link readonly name="picker" label="审批人" placeholder="请选择审批人"
+          @click="showSprUserPicker = true" :rules="[{ required: true, message: '请选择审批人' }]" />
+        <van-popup v-model:show="showSprUserPicker" position="bottom">
+          <van-picker :columns="userList" @confirm="onSprUserConfirm" @cancel="showSprUserPicker = false" />
+        </van-popup>
+
+      </van-cell-group>
+      <div style="margin: 16px;">
+        <van-button round block type="primary" native-type="submit">
+          提交
+        </van-button>
+      </div>
+    </van-form>
+  </div>
+</template>

+ 6 - 0
src/pages/borrowReceive/borrowList/index.vue

@@ -0,0 +1,6 @@
+<script setup>
+
+</script>
+<template>
+  1234
+</template>

+ 6 - 0
src/pages/borrowReceive/schoolPropertyList/index.vue

@@ -0,0 +1,6 @@
+<script setup>
+
+</script>
+<template>
+  123
+</template>

+ 1 - 0
src/pages/equipmentPurchaseApply/budgetOfPlant/myAuditFor/index.vue

@@ -81,6 +81,7 @@ function auditConfirm() {
     }).then((res) => {
       if (res.code == "1") {
         showToast(res.msg);
+        auditShow = false;
         listMyApplyFor.value = [];
         pageMyApplyFor = 1;
         onLoadMyApplyFor();

+ 25 - 9
src/pages/menuData.js

@@ -46,15 +46,16 @@ export const menuList = [
       { icon: getAssetsImages('index/sbxmk.png'), menuName: '设备项目库', path: '/equipmentPurchaseApply/equipmentItemLibrary' },
     ],
   },
-  // {
-  //   title: '会议预定管理',
-  //   list: [
-  //     { icon: getAssetsImages('index/hysyd.png'), menuName: '会议室预定' },
-  //     { icon: getAssetsImages('index/hyjy.png'), menuName: '会议纪要' },
-  //     { icon: getAssetsImages('index/hyjyk.png'), menuName: '会议纪要库' },
-  //     { icon: getAssetsImages('index/hysgl.png'), menuName: '会议室管理' },
-  //   ],
-  // },
+  {
+    tag: 'hyydgl',
+    title: '会议预定管理',
+    list: [
+      { icon: getAssetsImages('index/hysyd.png'), menuName: '会议室预定', path: '/reserveMeetingRooms' },
+      // { icon: getAssetsImages('index/hyjy.png'), menuName: '会议纪要' },
+      // { icon: getAssetsImages('index/hyjyk.png'), menuName: '会议纪要库' },
+      // { icon: getAssetsImages('index/hysgl.png'), menuName: '会议室管理' },
+    ],
+  },
   {
     tag: 'xmgl',
     title: '项目管理',
@@ -64,6 +65,21 @@ export const menuList = [
       { icon: getAssetsImages('index/xmzlk.png'), menuName: '项目资料库', path: '/projectManager/projectDatabase' },
     ],
   },
+  {
+    tag: 'xzfw',
+    title: '行政服务',
+    list: [
+      { icon: getAssetsImages('index/jslswc.png'), menuName: '教师临时外出', path: '/administrativeService/teacherTempGoOut' },
+    ],
+  },
+  {
+    tag: 'jyly',
+    title: '借用领用',
+    list: [
+      { icon: getAssetsImages('index/xclb.png'), menuName: '校产列表', path: '/borrowReceive/schoolPropertyList' },
+      { icon: getAssetsImages('index/jylb.png'), menuName: '借用列表', path: '/borrowReceive/borrowList' },
+    ],
+  },
   // {
   //   title: '学生竞赛管理',
   //   list: [

+ 11 - 2
src/pages/officialDocumentManager/documentLibrary/detail/documentDetail/index.vue

@@ -6,6 +6,7 @@ const { currentRoute } = useRouter()
 const route = currentRoute.value
 const gw_id = route.query.gw_id
 const detailData = ref({})
+let pdfHeight = $ref('')
 showLoadingToast({
   message: '加载中...',
   forbidClick: true,
@@ -17,14 +18,22 @@ request({
   },
 }).then((res) => {
   closeToast()
+
+
   detailData.value = res.data.one_info
   const appendUrl = res.data.one_info.gw_content.split('|')[0]
-  const curFileShowUrl = appendUrl.replace(/\.\w+$/, '.pdf')
+  const curFileShowUrl = window.globalVariables.api
+    + appendUrl.replace(/\.\w+$/, '.pdf')
   const pdfh5 = new Pdfh5('#pdfContent', {
     pdfurl: curFileShowUrl,
     scrollEnable: false,
     zoomEnable: false,
   })
+  pdfh5.on('complete', (status, msg) => {
+    const height = document.getElementsByClassName("pageContainer")[0].style['min-height'];
+    const num = document.getElementsByClassName("pageContainer").length
+    pdfHeight = parseFloat(height) * num + 50
+  });
 })
 </script>
 
@@ -90,7 +99,7 @@ request({
         </table>
       </div>
     </div>
-    <div id="pdfContent" />
+    <div id="pdfContent" :style="{ height: pdfHeight + 'px' }" />
   </div>
 </template>
 

+ 5 - 19
src/pages/officialDocumentManager/documentLibrary/index.vue

@@ -21,6 +21,7 @@ function onLoad() {
       limit: 20,
       gw_fb: 1,
       gw_fb_depart: isBureau ? "" : "1",
+      display_all: isBureau ? '1' : "",
       ...param,
     },
   }).then((res) => {
@@ -51,29 +52,14 @@ function cellClick(gw_id) {
 
 <template>
   <div>
-    <van-search
-      v-model="param.keyword"
-      :clearable="false"
-      show-action
-      placeholder="请输入搜索关键词"
-      @search="onClickSearch"
-    >
+    <van-search v-model="param.keyword" :clearable="false" show-action placeholder="请输入搜索关键词" @search="onClickSearch">
       <template #action>
         <div @click="onClickSearch">搜索</div>
       </template>
     </van-search>
-    <van-list
-      v-model:loading="loading"
-      :finished="finished"
-      finished-text="没有更多了"
-      @load="onLoad"
-    >
-      <van-cell
-        v-for="(item, index) in list"
-        :key="item"
-        :title="`${index + 1}. ${item.gw_title}`"
-        @click="cellClick(item.gw_id)"
-      />
+    <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+      <van-cell v-for="(item, index) in list" :key="item" :title="`${index + 1}. ${item.gw_title}`"
+        @click="cellClick(item.gw_id)" />
     </van-list>
   </div>
 </template>

+ 9 - 2
src/pages/officialDocumentManager/myOfficialDocument/detail/index.vue

@@ -10,6 +10,7 @@ showLoadingToast({
   message: '加载中...',
   forbidClick: true,
 })
+let pdfHeight = $ref('')
 request({
   url: '/jdbg/gwgl_gw/detail',
   data: {
@@ -19,12 +20,18 @@ request({
   closeToast()
   detailData.value = res.data.one_info
   const appendUrl = res.data.one_info.gw_content.split('|')[0]
-  const curFileShowUrl = appendUrl.replace(/\.\w+$/, '.pdf')
+  const curFileShowUrl = window.globalVariables.api
+    + appendUrl.replace(/\.\w+$/, '.pdf')
   const pdfh5 = new Pdfh5('#pdfContent', {
     pdfurl: curFileShowUrl,
     scrollEnable: false,
     zoomEnable: false,
   })
+  pdfh5.on('complete', (status, msg) => {
+    const height = document.getElementsByClassName("pageContainer")[0].style['min-height'];
+    const num = document.getElementsByClassName("pageContainer").length
+    pdfHeight = parseFloat(height) * num + 50
+  });
 })
 </script>
 
@@ -91,7 +98,7 @@ request({
       </div>
     </div>
 
-    <div id="pdfContent" />
+    <div id="pdfContent" :style="{ height: pdfHeight + 'px' }" />
   </div>
 </template>
 

+ 24 - 11
src/pages/officialDocumentManager/todoOffcialDoucument/detail/index.vue

@@ -1,13 +1,15 @@
 <script setup>
 import { closeToast, showLoadingToast, showToast } from 'vant'
 import Pdfh5 from 'pdfh5'
-
+import { userInfo } from "~/store/user";
+const { user_id } = userInfo;
 const { currentRoute } = useRouter()
 const route = currentRoute.value
 const gw_id = route.query.gw_id
 const detailData = ref({})
 const shjl = ref([])
 
+let pdfHeight = $ref('')
 function getData() {
   showLoadingToast({
     message: '加载中...',
@@ -23,12 +25,19 @@ function getData() {
     detailData.value = res.data.one_info
     shjl.value = res.data.one_info.shjl
     const appendUrl = res.data.one_info.gw_content.split('|')[0]
-    const curFileShowUrl = appendUrl.replace(/\.\w+$/, '.pdf')
+    const curFileShowUrl = window.globalVariables.api
+      + appendUrl.replace(/\.\w+$/, '.pdf')
     const pdfh5 = new Pdfh5('#pdfContent', {
       pdfurl: curFileShowUrl,
       scrollEnable: false,
       zoomEnable: false,
     })
+    pdfh5.on('complete', (status, msg) => {
+      const height = document.getElementsByClassName("pageContainer")[0].style['min-height'];
+      const num = document.getElementsByClassName("pageContainer").length
+      pdfHeight = parseFloat(height) * num + 50
+    });
+
   })
 }
 getData()
@@ -36,7 +45,13 @@ getData()
 const auditchecked = ref('')
 const auditDialogShow = ref(false)
 const sh_reason = ref('')
-function clickAudit() {
+function clickAudit(item) {
+  let ShPerson = item.sh_user_id;
+  let localPerson = user_id;
+  if (ShPerson !== localPerson) {
+    showToast('请审核自己的项目')
+    return
+  }
   auditchecked.value = ''
   sh_reason.value = ''
   auditDialogShow.value = true
@@ -47,7 +62,7 @@ function beforeCloseDialog(action) {
       showToast('请选择审核结果')
       return false
     }
-    else if ((auditchecked.value === '2') && sh_reason.value == '') {
+    else if (sh_reason.value == '') {
       showToast('请填写意见')
       return false
     }
@@ -177,7 +192,7 @@ function dialogSubmit() {
                   通过
                 </div>
                 <div v-else-if="item.sh_status == 1">
-                  <van-button class="rightButton" type="primary" @click.stop="clickAudit()">
+                  <van-button class="rightButton" type="primary" @click.stop="clickAudit(item)">
                     审核
                   </van-button>
                 </div>
@@ -200,11 +215,9 @@ function dialogSubmit() {
         </table>
       </div>
     </div>
-    <div id="pdfContent" />
-    <van-dialog
-      v-model:show="auditDialogShow" title="审核" confirm-button-text="提交" show-cancel-button
-      :before-close="beforeCloseDialog"
-    >
+    <div id="pdfContent" :style="{ height: pdfHeight + 'px' }" />
+    <van-dialog v-model:show="auditDialogShow" title="审核" confirm-button-text="提交" show-cancel-button
+      :before-close="beforeCloseDialog">
       <div class="dialogDiv">
         <van-radio-group v-model="auditchecked">
           <van-cell-group inset>
@@ -220,7 +233,7 @@ function dialogSubmit() {
             </van-cell>
           </van-cell-group>
         </van-radio-group>
-        <van-field v-if="auditchecked === '3'" v-model="sh_reason" rows="3" autosize type="textarea" placeholder="填写意见" />
+        <van-field v-model="sh_reason" rows="3" autosize type="textarea" placeholder="填写意见" />
       </div>
     </van-dialog>
   </div>

+ 9 - 2
src/pages/officialDocumentManager/todoReadDoucument/detail/index.vue

@@ -11,6 +11,7 @@ showLoadingToast({
   message: '加载中...',
   forbidClick: true,
 })
+let pdfHeight = $ref('')
 request({
   url: '/jdbg/gwgl_gw/detail',
   data: {
@@ -20,12 +21,18 @@ request({
   closeToast()
   detailData.value = res.data.one_info
   const appendUrl = res.data.one_info.gw_content.split('|')[0]
-  const curFileShowUrl = appendUrl.replace(/\.\w+$/, '.pdf')
+  const curFileShowUrl = window.globalVariables.api
+    + appendUrl.replace(/\.\w+$/, '.pdf')
   const pdfh5 = new Pdfh5('#pdfContent', {
     pdfurl: curFileShowUrl,
     scrollEnable: false,
     zoomEnable: false,
   })
+  pdfh5.on('complete', (status, msg) => {
+    const height = document.getElementsByClassName("pageContainer")[0].style['min-height'];
+    const num = document.getElementsByClassName("pageContainer").length
+    pdfHeight = parseFloat(height) * num + 50
+  });
 })
 </script>
 
@@ -81,7 +88,7 @@ request({
       </div>
     </div>
 
-    <div id="pdfContent" />
+    <div id="pdfContent" :style="{ height: pdfHeight + 'px' }" />
   </div>
 </template>
 

+ 8 - 1
src/pages/officialDocumentManager/todoReadDoucument/index.vue

@@ -1,11 +1,18 @@
 <script setup>
 import bureauDocument from './bureauDocument/index.vue'
 import schoolDoucment from './schoolDoucment/index.vue'
+
+import { userInfo } from "~/store/user";
+
+const { uo_type } = userInfo;
+const isBureau = ref(false); // 当前用户是否局端
+isBureau.value = uo_type === "1";
 </script>
 
 <template>
   <div>
-    <van-tabs :sticky="true">
+    <bureauDocument v-if="isBureau" />
+    <van-tabs :sticky="true" v-if="!isBureau">
       <van-tab title="教育局发文">
         <bureauDocument />
       </van-tab>

+ 224 - 159
src/pages/projectManager/projectDatabase/detail/index.vue

@@ -1,159 +1,165 @@
 <script setup>
-import { closeToast, showLoadingToast, showSuccessToast, showFailToast, showConfirmDialog } from 'vant'
+import * as dd from 'dingtalk-jsapi'
+import { closeToast, showConfirmDialog, showFailToast, showSuccessToast } from 'vant'
 import axios from 'axios'
-import { useUserStore } from "~/store/user";
-const userInfo = useUserStore();
-const loading = ref(false);
+import { useUserStore } from '~/store/user'
+
+const userInfo = useUserStore()
+const loading = ref(false)
 const { currentRoute } = useRouter()
 const route = currentRoute.value
 const xm_id = route.query.xm_id
 const detailData = ref({})
 const jdData = ref([
-  { v: "1", n: "项目立项" },
-  { v: "2", n: "项目招标" },
-  { v: "3", n: "项目施工" },
-  { v: "4", n: "项目付款" }
+  { v: '1', n: '项目立项' },
+  { v: '2', n: '项目招标' },
+  { v: '3', n: '项目施工' },
+  { v: '4', n: '项目付款' },
 ])
-const scrollHeight = ref(0);
-const currentStep = ref(0);
+const scrollHeight = ref(0)
+const currentStep = ref(0)
 const stepData = ref([])
 
-const currentData = ref({});
-const dialogVisible = ref(false);
-const dialogTitle = ref("");
-const dialogType = ref("");
-const fileData = ref([]);
+const currentData = ref({})
+const dialogVisible = ref(false)
+const dialogTitle = ref('')
+const dialogType = ref('')
+const fileData = ref([])
 
-initDetailInfo();
+initDetailInfo()
 function initDetailInfo() {
-  loading.value = true;
+  loading.value = true
   request({
     url: '/jdbg/xmgl_xmzlk/detail',
     data: {
       xm_id,
     },
   }).then((res) => {
-    loading.value = false;
+    loading.value = false
     closeToast()
-    detailData.value = res.data.one_info;
-    detailData.value.xm_start_time = detailData.value.xm_start_time.substring(0, 10);
+    detailData.value = res.data.one_info
+    detailData.value.xm_start_time = detailData.value.xm_start_time.substring(0, 10)
 
-    stepData.value = [];
-    currentStep.value = 0;
+    stepData.value = []
+    currentStep.value = 0
     detailData.value.xmlc.map((item, i) => {
-      item.order = i + 1;
-      item.lcIndex = i;
-      item.fileData = [];
+      item.order = i + 1
+      item.lcIndex = i
+      item.fileData = []
       if (item.lc_fj) {
-        let lc_fj = item.lc_fj.split(";");
-        lc_fj.map(v => {
-          let arr = v.split("|");
+        const lc_fj = item.lc_fj.split(';')
+        lc_fj.map((v) => {
+          const arr = v.split('|')
           item.fileData.push({
             url: arr[0],
-            name: arr[1]
+            name: arr[1],
           })
         })
       }
 
-      if (item.xmlc_wc == 1) {
-        currentStep.value = i + 1;
-      }
-      let index = stepData.value.findIndex(val => val.lc_jd == item.lc_jd);
+      if (item.xmlc_wc == 1)
+        currentStep.value = i + 1
+
+      const index = stepData.value.findIndex(val => val.lc_jd == item.lc_jd)
       if (index == -1) {
-        let obj = {
+        const obj = {
           lc_jd: item.lc_jd,
-          name: "",
-          children: [item]
+          name: '',
+          children: [item],
         }
-        jdData.value.map(val => {
-          if (obj.lc_jd == val.v) {
-            obj.name = val.n;
-          }
+        jdData.value.map((val) => {
+          if (obj.lc_jd == val.v)
+            obj.name = val.n
         })
-        stepData.value.push(obj);
-      } else {
-        stepData.value[index].children.push(item);
+        stepData.value.push(obj)
+      }
+      else {
+        stepData.value[index].children.push(item)
       }
     })
 
-    handleScroll();
+    handleScroll()
   })
 }
 
 function fillIn(data) {
-  if (currentStep.value != data.lcIndex) {
+  if (currentStep.value != data.lcIndex)
     return
-  }
-  currentData.value = data;
-  dialogVisible.value = true;
+
+  currentData.value = data
+  dialogVisible.value = true
   if (data.lc_bt == 1) {
-    dialogTitle.value = "必填项";
-    dialogType.value = 2;
-  } else {
-    dialogTitle.value = "填写";
-    dialogType.value = 3;
+    dialogTitle.value = '必填项'
+    dialogType.value = 2
+  }
+  else {
+    dialogTitle.value = '填写'
+    dialogType.value = 3
   }
 }
 
 function beforeCloseDialog(action) {
   if (action == 'confirm') {
     if (dialogType.value != 1) {
-      if (currentData.value.lc_bt == 1 && currentData.value.xmlc_bt_value == "") {
-        showFailToast("请输入必填项!");
-        return false;
+      if (currentData.value.lc_bt == 1 && currentData.value.xmlc_bt_value == '') {
+        showFailToast('请输入必填项!')
+        return false
       }
-      handleClose();
-    } else {
-      handleUpload();
+      handleClose()
+    }
+    else {
+      handleUpload()
     }
-  } else {
-    handleClose();
+  }
+  else {
+    handleClose()
   }
 }
 
-
 function handleClose() {
-  dialogVisible.value = false;
-  currentData.value = {};
-  dialogType.value = "";
-  dialogTitle.value = "";
-  fileData.value = [];
+  dialogVisible.value = false
+  currentData.value = {}
+  dialogType.value = ''
+  dialogTitle.value = ''
+  fileData.value = []
 }
 
 function handleFinish(data, type) {
-  if (type == 2) {
+  if (type == 2)
     return
-  }
+
   if (data.lc_bt == 1) {
-    if (data.xmlc_bt_value == "") {
-      showFailToast("请输入" + data.lc_bt_name + "!");
-    } else {
-      commit(data, type);
+    if (data.xmlc_bt_value == '')
+      showFailToast(`请输入${data.lc_bt_name}!`)
+
+    else
+      commit(data, type)
+  }
+  else {
+    if (data.lc_bt_name == '') {
+      commit(data, type)
     }
-  } else {
-    if (data.lc_bt_name == "") {
-      commit(data, type);
-    } else {
-      if (data.xmlc_bt_value != "") {
-        commit(data, type);
-        return;
+    else {
+      if (data.xmlc_bt_value != '') {
+        commit(data, type)
+        return
       }
       showConfirmDialog({
         title: '提示',
-        message: data.lc_bt_name + "未填写,是否确定完成",
+        message: `${data.lc_bt_name}未填写,是否确定完成`,
       })
         .then(() => {
-          commit(data, type);
+          commit(data, type)
         })
         .catch(() => {
-        });
+        })
     }
   }
 }
 
 async function commit(data, type, close) {
-  let obj = {
-    xm_id: xm_id,
+  const obj = {
+    xm_id,
     xmlc_id: data.xmlc_id,
     xmlc_wc: type,
     lc_bt_name: data.lc_bt_name,
@@ -162,111 +168,124 @@ async function commit(data, type, close) {
     lc_wc_name: userInfo.real_name,
   }
 
-  loading.value = true;
+  loading.value = true
   request({
     url: '/jdbg/xmgl_xmzlk/edit_lc',
     data: obj,
   }).then(({ code }) => {
-    loading.value = false;
+    loading.value = false
     if (code == 1) {
-      let con = document.querySelector(".xmgktParentDiv");
-      scrollHeight.value = con.scrollTop;
+      const con = document.querySelector('.xmgktParentDiv')
+      scrollHeight.value = con.scrollTop
 
-      if (close) {
-        handleClose();
-      } else {
-        showSuccessToast('事项完成!');
-      }
-      initDetailInfo();
+      if (close)
+        handleClose()
+
+      else
+        showSuccessToast('事项完成!')
+
+      initDetailInfo()
     }
   })
 }
 
 function handleScroll() {
   setTimeout(() => {
-    let con = document.querySelector(".xmgktParentDiv");
+    const con = document.querySelector('.xmgktParentDiv')
     con.scrollTo({
-      top: scrollHeight.value
+      top: scrollHeight.value,
     })
   }, 0)
 }
 
 function handleOpen(data) {
-  currentData.value = data;
-  dialogVisible.value = true;
-  dialogTitle.value = data.lc_sx;
-  dialogType.value = 1;
-  fileData.value = data.fileData;
+  currentData.value = data
+  dialogVisible.value = true
+  dialogTitle.value = data.lc_sx
+  dialogType.value = 1
+  fileData.value = data.fileData
 }
 
 function handleAfterRead(file) {
   if (file.file) {
-    const formData = new FormData();
-    formData.append("api", "json");
-    formData.append("token", userInfo.token);
-    formData.append("urltype", "0");
-    formData.append("filedata", file.file);
-    loading.value = true;
+    const formData = new FormData()
+    formData.append('api', 'json')
+    formData.append('token', userInfo.token)
+    formData.append('urltype', '0')
+    formData.append('filedata', file.file)
+    loading.value = true
     axios({
       method: 'post',
-      url: window.globalVariables.api + "/upload/main/file",
+      url: `${window.globalVariables.api}/upload/main/file`,
       headers: { 'Content-Type': 'multipart/form-data' },
-      data: formData
+      data: formData,
     })
       .then((res) => {
-        loading.value = false;
+        loading.value = false
         if (res.data.code === '1') {
           fileData.value.unshift({
             url: res.data.data.url,
-            name: res.data.data.file_name
+            name: res.data.data.file_name,
           })
-        } else {
-          showFailToast("上传失败!");
+        }
+        else {
+          showFailToast('上传失败!')
         }
       })
-      .catch(error => {
+      .catch((error) => {
         console.log(error)
       })
   }
 }
 
 function handleUpload() {
-  let arr = fileData.value.map(item => {
+  const arr = fileData.value.map((item) => {
     return `${item.url}|${item.name}`
   })
-  currentData.value.lc_fj = arr.join(";");
-  commit(currentData.value, currentData.value.xmlc_wc, true);
+  currentData.value.lc_fj = arr.join(';')
+  commit(currentData.value, currentData.value.xmlc_wc, true)
 }
 
 function handleRemove(index) {
-  fileData.value.splice(index, 1);
+  fileData.value.splice(index, 1)
 }
 
-const dialogPreviewVisible = ref(false);
-const showUrl = ref("");
-const suffix = ref("");
-const previewUrl = ref("https://view.officeapps.live.com/op/view.aspx?src=");
+const dialogPreviewVisible = ref(false)
+const showUrl = ref('')
+const suffix = ref('')
+const previewUrl = ref('https://view.officeapps.live.com/op/view.aspx?src=')
 function handlePreview(data) {
-  showUrl.value = getFullUrl(data.url);
-  suffix.value = showUrl.value.substr(showUrl.value.lastIndexOf(".") + 1).toLowerCase();
+  showUrl.value = getFullUrl(data.url)
+  suffix.value = showUrl.value.substr(showUrl.value.lastIndexOf('.') + 1).toLowerCase()
   // dialogPreviewVisible.value = true;
 
-  if (suffix.value == "mp3" || suffix.value == "mp4" || suffix.value == "pdf" || suffix.value == "jpg" || suffix.value == "jpeg" || suffix.value == "png") {
-    window.open(showUrl.value);
-  } else {
-    window.open(previewUrl.value + showUrl.value);
+  if (suffix.value == 'mp3' || suffix.value == 'mp4' || suffix.value == 'pdf' || suffix.value == 'jpg' || suffix.value == 'jpeg' || suffix.value == 'png') {
+    dd.biz.util.openLink({
+      url: showUrl.value,//要打开链接的地址
+    })
+  }
+  else {
+    dd.biz.util.openLink({
+      url: previewUrl.value + showUrl.value,//要打开链接的地址
+    })
   }
 }
 
 function getFullUrl(url) {
-  if (!url) return '';
-  return url.startsWith('http') ? url : window.GLOBAL_CONFIG.api + '/' + url
+  if (!url)
+    return ''
+  if (url.includes('60.188.226.44:8090')) {
+    url = url.replace('60.188.226.44:8090', 'jnjymf.bozedu.net')
+  }
+  return url.startsWith('http') ? url : `http://jnjymf.bozedu.net/${url}`
 }
 </script>
 
 <template>
   <div v-show="loading" class="h-100vh w-full absolute z-3000 bg-hex-000000b3 flex items-center justify-center">
-    <van-loading color="#ffffffcc" text-color="#ffffffcc" vertical>加载中...</van-loading>
+    <van-loading color="#ffffffcc" text-color="#ffffffcc" vertical>
+      加载中...
+    </van-loading>
   </div>
   <div class="xmgktParentDiv h-100vh overflow-auto bg-white">
     <div class="tableContainer">
@@ -307,17 +326,20 @@ function getFullUrl(url) {
     </div>
 
     <div class="xmgktManageContent">
-      <div class="stepDiv" v-for="(item, index) in stepData" :key="index">
-        <div class="parent-head nowrap" :class="item.children[0].xmlc_wc==1?'finished':''">
+      <div v-for="(item, index) in stepData" :key="index" class="stepDiv">
+        <div class="parent-head nowrap" :class="item.children[0].xmlc_wc == 1 ? 'finished' : ''">
           <div class="step-head">
-            <div class="parent-head-line"></div>
+            <div class="parent-head-line" />
+          </div>
+          <div class="parent-name whitespace-nowrap">
+            {{ item.name }}
           </div>
-          <div class="parent-name whitespace-nowrap">{{item.name}}</div>
         </div>
         <div class="parent">
-          <div class="child d-flex" :class="value.xmlc_wc==1?'finished':''" v-for="(value, i) in item.children" :key="i">
+          <div v-for="(value, i) in item.children" :key="i" class="child d-flex"
+            :class="value.xmlc_wc == 1 ? 'finished' : ''">
             <div class="step-head">
-              <div class="step-line" v-if="index!=stepData.length-1 || i!=item.children.length-1"></div>
+              <div v-if="index != stepData.length - 1 || i != item.children.length - 1" class="step-line" />
               <div class="step-check d-flex flex-v-mid flex-l-mid">
                 <van-icon name="success" />
               </div>
@@ -325,22 +347,37 @@ function getFullUrl(url) {
             <div class="mainCon flex-1 flex-row">
               <div>
                 <div class="flex">
-                  <div class="w-130px">{{value.order}}.{{value.lc_sx}}</div>
-                  <div class="w-80px">事项权值 {{value.lc_sxqz}}</div>
+                  <div class="w-130px">
+                    {{ value.order }}.{{ value.lc_sx }}
+                  </div>
+                  <div class="w-80px">
+                    事项权值 {{ value.lc_sxqz }}
+                  </div>
                 </div>
                 <div class="flex mt-5px">
-                  <div v-if="value.lc_fj && value.lc_fj!=''" class="w-130px text-hex-265CD4" @click="handleOpen(value)">查看附件</div>
-                  <div v-else class="w-130px">未上传附件</div>
-                  <div v-if="value.lc_bt_name=='' || value.lc_bt_name==undefined"></div>
+                  <div v-if="value.lc_fj && value.lc_fj != ''" class="w-130px text-hex-265CD4" @click="handleOpen(value)">
+                    查看附件
+                  </div>
+                  <div v-else class="w-130px">
+                    未上传附件
+                  </div>
+                  <div v-if="value.lc_bt_name == '' || value.lc_bt_name == undefined" />
                   <div v-else class="d-flex whitespace-nowrap">
-                    <div>{{value.lc_bt_name}}: </div>
-                    <div class="hand" @click="fillIn(value)">{{value.xmlc_bt_value == "" ? "待填" : value.xmlc_bt_value + "万元"}}</div>
+                    <div>{{ value.lc_bt_name }}: </div>
+                    <div class="hand" @click="fillIn(value)">
+                      {{ value.xmlc_bt_value == "" ? "待填" : `${value.xmlc_bt_value
+                        }万元` }}
+                    </div>
                   </div>
                 </div>
-                <div class="attach">*{{value.lc_fj_bz}}</div>
+                <div class="attach">
+                  *{{ value.lc_fj_bz }}
+                </div>
               </div>
               <div class="text-right">
-                <div class="whitespace-nowrap text-hex-A2A2A2 text-8px mt-3px" v-if="value.xmlc_wc==1">{{value.lc_wc_name}}点击完成</div>
+                <div v-if="value.xmlc_wc == 1" class="whitespace-nowrap text-hex-A2A2A2 text-8px mt-3px">
+                  {{ value.lc_wc_name }}点击完成
+                </div>
               </div>
             </div>
           </div>
@@ -348,12 +385,13 @@ function getFullUrl(url) {
       </div>
     </div>
 
-    <van-dialog v-model:show="dialogVisible" :title="dialogTitle" show-cancel-button :show-confirm-button="false" :before-close="beforeCloseDialog">
+    <van-dialog v-model:show="dialogVisible" :title="dialogTitle" show-cancel-button :show-confirm-button="false"
+      :before-close="beforeCloseDialog">
       <!-- <div v-if="dialogType!=1" class="flex items-center flex-v-mid px-2 py-3">
         <div class="whitespace-nowrap"><span class="" style="color: red;" v-if="currentData.lc_bt==1">*</span>{{currentData.lc_bt_name}}:</div>
         <input class="flex-1 border px-1 py-5px rounded-6px" type="number" v-model="currentData.xmlc_bt_value" oninput="if(value.length>10)value=value.slice(0,10)" />
       </div> -->
-      <div v-if="dialogType==1" class="px-2 py-3">
+      <div v-if="dialogType == 1" class="px-2 py-3">
         <!-- <van-uploader accept="*" :after-read="handleAfterRead">
           <van-button size="small" type="primary">点击上传</van-button>
         </van-uploader> -->
@@ -361,7 +399,9 @@ function getFullUrl(url) {
           <div v-for="(item, index) in fileData" :key="index">
             <div class="flex items-center space-x-8px">
               <van-icon name="description" />
-              <div class="flex-1 truncate" @click="handlePreview(item)">{{ item.name }}</div>
+              <div class="flex-1 truncate" @click="handlePreview(item)">
+                {{ item.name }}
+              </div>
               <!-- <van-icon name="cross" @click="handleRemove(index)" /> -->
             </div>
           </div>
@@ -369,16 +409,20 @@ function getFullUrl(url) {
       </div>
     </van-dialog>
 
-    <van-dialog class="previewDiv" v-model:show="dialogPreviewVisible" title="查看" show-cancel-button :show-confirm-button="false">
+    <van-dialog v-model:show="dialogPreviewVisible" class="previewDiv" title="查看" show-cancel-button
+      :show-confirm-button="false">
       <div class="h-full">
-        <video ref="videoPlay" v-if="suffix=='mp4' || suffix=='MP4'" controls>
-          <source :src="showUrl" type="video/mp4" />
-          <source :src="showUrl" type="video/ogg" />
+        <video v-if="suffix == 'mp4' || suffix == 'MP4'" ref="videoPlay" controls>
+          <source :src="showUrl" type="video/mp4">
+          <source :src="showUrl" type="video/ogg">
         </video>
-        <audio ref="audioPlay" v-else-if="suffix=='mp3' || suffix=='MP3'" controls :src="showUrl"></audio>
-        <img v-else-if="suffix=='jpg' || suffix=='JPG' || suffix=='jpeg' || suffix=='JPEG' || suffix=='png' || suffix=='PNG'" :src="showUrl" alt="" style="width: 100%;max-height: 100%;">
-        <iframe v-else-if="suffix=='pdf' || suffix=='PDF'" class="iframe" :src="showUrl" width="100%" frameborder="0" scrolling="auto"></iframe>
-        <iframe v-else class="iframe" :src="previewUrl+showUrl" width="100%" frameborder="0" scrolling="auto"></iframe>
+        <audio v-else-if="suffix == 'mp3' || suffix == 'MP3'" ref="audioPlay" controls :src="showUrl" />
+        <img
+          v-else-if="suffix == 'jpg' || suffix == 'JPG' || suffix == 'jpeg' || suffix == 'JPEG' || suffix == 'png' || suffix == 'PNG'"
+          :src="showUrl" alt="" style="width: 100%;max-height: 100%;">
+        <iframe v-else-if="suffix == 'pdf' || suffix == 'PDF'" class="iframe" :src="showUrl" width="100%" frameborder="0"
+          scrolling="auto" />
+        <iframe v-else class="iframe" :src="previewUrl + showUrl" width="100%" frameborder="0" scrolling="auto" />
       </div>
     </van-dialog>
   </div>
@@ -387,33 +431,40 @@ function getFullUrl(url) {
 <style lang="scss" scoped>
 $color: #4351ff;
 $color1: #d2e7fd;
+
 .flex-row {
   display: flex;
   justify-content: space-between;
   align-items: center;
 }
+
 .d-flex {
   display: flex;
 }
+
 .xmgktManageContent {
   padding: 10px;
   font-size: 12px;
+
   .stepDiv {
     .step-head {
       width: 30px;
       height: 100%;
       position: relative;
     }
+
     .parent-head {
       position: relative;
       display: inline-block;
       margin-bottom: -5px;
+
       .parent-head-line {
         width: 1px;
         height: 50px;
         margin: auto;
         background: #e2e2e2;
       }
+
       .parent-name {
         position: absolute;
         top: 0;
@@ -423,21 +474,25 @@ $color1: #d2e7fd;
         left: 60%;
         transform: translateX(-50%);
       }
+
       &.finished {
         .parent-head-line {
           background: $color1;
         }
       }
     }
+
     .parent {
       .child {
         height: 70px;
+
         .step-line {
           width: 1px;
           height: 100%;
           margin: auto;
           background: #e2e2e2;
         }
+
         .step-check {
           width: 22px;
           height: 22px;
@@ -453,21 +508,25 @@ $color1: #d2e7fd;
           justify-content: center;
           align-items: center;
         }
+
         .mainCon {
           border-bottom: 1px solid #e6e6e6;
           margin-left: 10px;
           margin-top: -15px;
           height: 100%;
+
           .attach {
             font-size: 12px;
             color: #ff0000;
             min-width: 100px;
             // width: 200px;
           }
+
           .van-button {
             width: 60px;
             height: 28px;
             padding: 0;
+
             &.van-button--info {
               background: #969696;
               border-color: #969696;
@@ -475,10 +534,12 @@ $color1: #d2e7fd;
             }
           }
         }
+
         &.finished {
           .step-line {
             background: $color1;
           }
+
           .step-check {
             background: #0976f8;
             box-shadow: 0 0 0 3px $color1;
@@ -488,18 +549,22 @@ $color1: #d2e7fd;
     }
   }
 }
+
 :deep() {
   .previewDiv {
     height: 80%;
     top: 50%;
+
     .van-dialog__header {
       padding: 0;
       line-height: 50px;
     }
+
     .van-dialog__content {
       padding: 0 10px;
       height: calc(100% - 100px);
     }
+
     video,
     audio,
     iframe {
@@ -508,4 +573,4 @@ $color1: #d2e7fd;
     }
   }
 }
-</style>
+</style>

+ 1 - 1
src/pages/projectManager/projectManageControl/detail/index.vue

@@ -331,7 +331,7 @@ function handleRemove(index) {
     <van-dialog v-model:show="dialogVisible" :title="dialogTitle" show-cancel-button :before-close="beforeCloseDialog">
       <div v-if="dialogType!=1" class="flex items-center flex-v-mid px-2 py-3">
         <div class="whitespace-nowrap"><span class="" style="color: red;" v-if="currentData.lc_bt==1">*</span>{{currentData.lc_bt_name}}:</div>
-        <input class="flex-1 border px-1 py-5px rounded-6px" type="number" v-model="currentData.xmlc_bt_value" oninput="if(value.length>10)value=value.slice(0,10)" />
+        <input class="border px-1 py-5px rounded-6px" style="width: 200px;" type="number" v-model="currentData.xmlc_bt_value" oninput="if(value.length>10)value=value.slice(0,10)" />
       </div>
       <div v-if="dialogType==1" class="px-2 py-3">
         <van-uploader accept="*" :after-read="handleAfterRead">

+ 150 - 0
src/pages/reserveMeetingRooms/detail/index.vue

@@ -0,0 +1,150 @@
+<script setup>
+import { closeToast, showLoadingToast } from 'vant'
+import QRCode from "qrcode";
+const { currentRoute } = useRouter()
+const route = currentRoute.value
+const hysyd_id = route.query.hysyd_id
+const detailData = ref({})
+showLoadingToast({
+    message: '加载中...',
+    forbidClick: true,
+})
+request({
+    url: '/jdbg/hy_hysyd/detail',
+    data: {
+        hysyd_id,
+    },
+}).then((res) => {
+    closeToast()
+    detailData.value = res.data.one_info
+    makeQrcode();
+})
+function getFile(f) {
+    let link = window.globalVariables.api + "/openapi/download.php?path=" + f.split('|')[0] + '&name=' + f.split('|')[1].split('.')[0]
+    window.open(link, '_blank')
+}
+let canvas = $ref();
+function makeQrcode() {
+    let opts = {
+        errorCorrectionLevel: "H",
+        type: "image.png",
+        width: 120,
+        height: 120,
+        text: detailData.value.qrcode,
+    };
+    QRCode.toCanvas(canvas, detailData.value.qrcode, opts);
+}
+
+function handleSign() {
+    window.open(detailData.value.qrcode, '_blank')
+}
+</script>
+
+<template>
+    <div>
+        <div class="tableContainer">
+            <div class="topPart">
+                <table class="Tb" width="100%" cellspacing="0" cellpadding="0">
+                    <tr>
+                        <td class="titleOpt">
+                            会议名称
+                        </td>
+                        <td>{{ detailData.hysyd_hymc }}</td>
+                    </tr>
+                    <tr>
+                        <td class="titleOpt">
+                            会议状态
+                        </td>
+                        <td>
+                            {{ detailData.hysyd_hyzt_option_n }}
+                        </td>
+                    </tr>
+                    <tr>
+                        <td class="titleOpt">
+                            会议室
+                        </td>
+                        <td>{{ detailData.hysyd_hys_mc }}</td>
+                    </tr>
+                    <tr>
+                        <td class="titleOpt">
+                            会议时间
+                        </td>
+                        <td class="leading-25px">
+                            <p>{{ detailData.hysyd_hysj_ks }} -</p>
+                            <p>{{ detailData.hysyd_hysj_js }}</p>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td class="titleOpt">会议资料</td>
+                        <td>
+                            <template v-if="detailData.hysyd_hyzl">
+                                <div v-for="(wj, index) in detailData.hysyd_hyzl.split(';')" :key="index">
+                                    <p class="cursor-pointer text-blue-500" @click="getFile(wj)">{{ wj.split("|")[1] }}</p>
+                                </div>
+                            </template>
+                            <span v-else>未上传附件</span>
+                        </td>
+                    </tr>
+                    <tr v-show="detailData.hysyd_ewm_option_k == '1'">
+                        <td>请扫描二维码进行签到</td>
+                        <td>
+                            <div class="flex items-center justify-between">
+                                <canvas ref="canvas"></canvas>
+                                <button class="border-1 border-hex-60a5fa text-hex-60a5fa h-30px px-10px rounded-10px"
+                                    @click="handleSign">点击签到</button>
+                            </div>
+                        </td>
+                    </tr>
+                </table>
+            </div>
+            <div class="nav">
+                <table class="Tb mt-20px text-14px" width="100%" cellspacing="0" cellpadding="0">
+                    <thead>
+                        <tr>
+                            <td class="text-15px text-center" colspan="4">参会人员签到状态</td>
+                        </tr>
+                    </thead>
+                    <tr>
+                        <td>序号</td>
+                        <td>参会人员</td>
+                        <td>签到状态</td>
+                        <td>签到时间</td>
+                    </tr>
+                    <tr v-for="(item, index) in detailData.sign" :key="item.user_id">
+                        <td>{{ index + 1 }}</td>
+                        <td>{{ item.realname }}</td>
+                        <td>{{ item.is_sign == 0 ? '未签到' : '已签到' }}</td>
+                        <td>
+                            <span class="signed" v-if="item.dateline">{{
+                                item.dateline }}</span>
+                            <span v-else>--</span>
+                        </td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+.titleOpt {
+    width: 30%;
+}
+
+.Tb tr td {
+    padding: 8px 8px;
+}
+
+.border_bottom {
+    border-bottom: 2px solid #666;
+    border-top: 2px solid #666;
+}
+
+.text-red {
+    color: red;
+}
+
+:deep(.specialTd table tbody tr td) {
+    border: 1px #CCCCCC solid !important;
+}
+</style>

+ 17 - 0
src/pages/reserveMeetingRooms/index.vue

@@ -0,0 +1,17 @@
+<script setup>
+import myInitateFor from './myInitiateFor/index.vue'
+import myAttendFor from './myAttendFor/index.vue'
+</script>
+
+<template>
+    <div>
+        <van-tabs :sticky="true">
+            <van-tab title="我发起的">
+                <myInitateFor />
+            </van-tab>
+            <van-tab title="我参与的">
+                <myAttendFor />
+            </van-tab>
+        </van-tabs>
+    </div>
+</template>

+ 104 - 0
src/pages/reserveMeetingRooms/myAttendFor/index.vue

@@ -0,0 +1,104 @@
+<script setup>
+import { userInfo } from '~/store/user'
+
+const { uo_type, uo_name, user_id } = userInfo
+const router = useRouter();
+const isBureau = ref(false)// 当前用户是否局端
+isBureau.value = uo_type === '1'
+const list = ref([])
+const loading = ref(false)
+const finished = ref(false)
+let page = 1
+const param = $ref({
+    hysyd_hyzt: '',
+    hysyd_hymc: '',
+    hysyd_chry_id: user_id
+})
+function onLoad() {
+    loading.value = true
+    request({
+        url: '/jdbg/hy_hysyd/index',
+        data: {
+            page,
+            limit: 20,
+            ...param,
+        },
+    }).then((res) => {
+        const data = res.data
+        list.value = [...list.value, ...data.page_data]
+        finished.value = data.total_page === page
+        page++
+        loading.value = false
+    })
+}
+const searchValue = $ref('')
+function onClickSearch() {
+    reGetList()
+}
+const yearOption = $ref([{ text: '状态', value: '' }, { text: '未开始', value: '0' }, { text: '进行中', value: '1' }, { text: '已结束', value: '2' }])
+const itemRef = ref(null)
+function onConfirm() {
+    itemRef.value.toggle()
+    reGetList()
+}
+function dropItemChange() {
+    reGetList()
+}
+function reGetList() {
+    page = 1
+    list.value = []
+    finished.value = false
+    onLoad()
+}
+
+function handleLinkTo(item) {
+    router.push({ path: '/reserveMeetingRooms/detail', query: { hysyd_id: item.hysyd_id } })
+}
+</script>
+
+<template>
+    <div class="index">
+        <van-search v-model="param.hysyd_hymc" :clearable="false" show-action placeholder="请输入搜索关键词"
+            @search="onClickSearch">
+            <template #action>
+                <div @click="onClickSearch">
+                    搜索
+                </div>
+            </template>
+        </van-search>
+        <van-dropdown-menu>
+            <van-dropdown-item v-model="param.hysyd_hyzt" :options="yearOption" @change="dropItemChange" />
+        </van-dropdown-menu>
+        <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+            <van-cell v-for="item in list" :key="item" @click="handleLinkTo(item)">
+                <template #title>
+                    <span>{{ `${item.hysyd_hymc}\u00A0\u00A0\u00A0 ${item.hysyd_hys_mc}` }}</span>
+                </template>
+                <template #value>
+                    <span style="color:black">状态:{{ item.hysyd_hyzt }}</span>
+                </template>
+                <template #label>
+                    <span class="van-ellipsis">会议时间:{{ item.hysyd_hysj_ks }}-{{ item.hysyd_hysj_js }}</span>
+                </template>
+            </van-cell>
+        </van-list>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+:deep(.van-cell__title) {
+    width: 70% !important;
+    flex: auto
+}
+
+:deep(.van-cell__value) {
+    width: 30% !important;
+    flex: auto
+}
+:deep(.van-dropdown-menu__title){
+    width: 70%;
+}
+:deep(.van-dropdown-menu__title::after){
+    right: 5.5rem;
+}
+</style>

+ 104 - 0
src/pages/reserveMeetingRooms/myInitiateFor/index.vue

@@ -0,0 +1,104 @@
+<script setup>
+import { userInfo } from '~/store/user'
+
+const { uo_type, uo_name, user_id } = userInfo
+const router = useRouter();
+const isBureau = ref(false)// 当前用户是否局端
+isBureau.value = uo_type === '1'
+const list = ref([])
+const loading = ref(false)
+const finished = ref(false)
+let page = 1
+const param = $ref({
+    hysyd_hyzt: '',
+    hysyd_hymc: '',
+    create_user_id: user_id
+})
+function onLoad() {
+    loading.value = true
+    request({
+        url: '/jdbg/hy_hysyd/index',
+        data: {
+            page,
+            limit: 20,
+            ...param,
+        },
+    }).then((res) => {
+        const data = res.data
+        list.value = [...list.value, ...data.page_data]
+        finished.value = data.total_page === page
+        page++
+        loading.value = false
+    })
+}
+const searchValue = $ref('')
+function onClickSearch() {
+    reGetList()
+}
+const yearOption = $ref([{ text: '状态', value: '' }, { text: '未开始', value: '0' }, { text: '进行中', value: '1' }, { text: '已结束', value: '2' }])
+const itemRef = ref(null)
+function onConfirm() {
+    itemRef.value.toggle()
+    reGetList()
+}
+function dropItemChange() {
+    reGetList()
+}
+function reGetList() {
+    page = 1
+    list.value = []
+    finished.value = false
+    onLoad()
+}
+
+function handleLinkTo(item) {
+    router.push({ path: '/reserveMeetingRooms/detail', query: { hysyd_id: item.hysyd_id } })
+}
+</script>
+
+<template>
+    <div class="index">
+        <van-search v-model="param.hysyd_hymc" :clearable="false" show-action placeholder="请输入搜索关键词"
+            @search="onClickSearch">
+            <template #action>
+                <div @click="onClickSearch">
+                    搜索
+                </div>
+            </template>
+        </van-search>
+        <van-dropdown-menu>
+            <van-dropdown-item class="text-left" v-model="param.hysyd_hyzt" :options="yearOption" @change="dropItemChange" />
+        </van-dropdown-menu>
+        <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+            <van-cell v-for="item in list" :key="item" @click="handleLinkTo(item)">
+                <template #title>
+                    <span>{{ `${item.hysyd_hymc}\u00A0\u00A0\u00A0 ${item.hysyd_hys_mc}` }}</span>
+                </template>
+                <template #value>
+                    <span style="color:black">状态:{{ item.hysyd_hyzt }}</span>
+                </template>
+                <template #label>
+                    <span class="van-ellipsis">会议时间:{{ item.hysyd_hysj_ks }}-{{ item.hysyd_hysj_js }}</span>
+                </template>
+            </van-cell>
+        </van-list>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+:deep(.van-cell__title) {
+    width: 70% !important;
+    flex: auto
+}
+
+:deep(.van-cell__value) {
+    width: 30% !important;
+    flex: auto
+}
+:deep(.van-dropdown-menu__title){
+    width: 70%;
+}
+:deep(.van-dropdown-menu__title::after){
+    right: 5.5rem;
+}
+</style>

+ 64 - 29
src/pages/sanZhongYiDa/projectApply/detail/index.vue

@@ -1,9 +1,12 @@
 <script setup>
 import { closeToast, showLoadingToast, showToast } from 'vant'
+import { userInfo } from "~/store/user";
 
+const { user_id } = userInfo;
 const { currentRoute } = useRouter()
 const route = currentRoute.value
 const xm_id = route.query.xm_id
+const type = route.query.type
 const detailData = ref({})
 const shjl = ref([])
 const fileFinalArr = ref([])
@@ -51,49 +54,50 @@ const auditchecked = ref('')
 const auditDialogShow = ref(false)
 const sh_reason = ref('')
 function clickAudit() {
-  auditchecked.value = ''
-  sh_reason.value = ''
-  auditDialogShow.value = true
+  auditchecked.value = "";
+  sh_reason.value = "";
+  auditDialogShow.value = true;
+
 }
 function beforeCloseDialog(action) {
-  if (action == 'confirm') {
-    if (auditchecked.value == '') {
-      showToast('请选择审核结果')
-      return false
-    }
-    else if ((auditchecked.value === '2') && sh_reason.value == '') {
-      showToast('请填写意见')
-      return false
-    }
-    else {
-      dialogSubmit()
-      return true
+  if (action == "confirm") {
+    if (auditchecked.value == "") {
+      showToast("请选择审核结果");
+      return false;
+    } else if (auditchecked.value === "3" && sh_reason.value == "") {
+      showToast("请填写意见");
+      return false;
+    } else {
+      dialogSubmit();
+      return true;
     }
-  }
-  else {
-    return true
+  } else {
+    return true;
   }
 }
 function dialogSubmit() {
   const transObj = {
-    xm_id,
-    sh_status: auditchecked.value, // 待审核 1通过 2驳回
+    sh_id: xm_id,
+    sh_status: auditchecked.value, //
     sh_reason: sh_reason.value, // 处理意见
-  }
+  };
   showLoadingToast({
-    message: '提交中...',
+    message: "提交中...",
     forbidClick: true,
-  })
+  });
   request({
-    url: '/jdbg/gwgl_gw/check',
+    url: "/jdbg/xmlxsb_xmsq/check",
     data: transObj,
   }).then((res) => {
-    closeToast()
+    closeToast();
     if (res.code == 1) {
-      showToast(res.msg)
-      getData()
+      closeToast()
+      if (res.code == 1) {
+        showToast(res.msg)
+        getData()
+      }
     }
-  })
+  });
 }
 </script>
 
@@ -217,7 +221,18 @@ function dialogSubmit() {
                 状态:
               </td>
               <td>
-                <div :style="{ color: item.sh_status == 3 ? 'red' : '' }">
+                <div v-if="type === 'myAuditFor' && user_id === item.sh_user_id">
+                  <van-button v-if="detailData.xm_status_option_k == '1' ||
+                    detailData.xm_status_option_k == '2' || detailData.xm_status_option_k === '3'
+                    " class="rightButton" type="primary" @click.stop="clickAudit()">
+                    审核
+                  </van-button>
+                  <van-button v-if="detailData.xm_status_option_k > '3' && detailData.xm_status_option_k <= '5'"
+                    color="#BDBDBD" class="rightButton">
+                    已审核
+                  </van-button>
+                </div>
+                <div v-else :style="{ color: item.sh_status == 3 ? 'red' : '' }">
                   {{ item.sh_status == 1 ? "未处理" : (item.sh_status == 2 ? '通过' : '不通过') }}
                 </div>
               </td>
@@ -236,6 +251,26 @@ function dialogSubmit() {
         </table>
       </div>
     </div>
+    <van-dialog v-model:show="auditDialogShow" title="审核" confirm-button-text="提交" show-cancel-button
+      :before-close="beforeCloseDialog">
+      <div class="dialogDiv">
+        <van-radio-group v-model="auditchecked">
+          <van-cell-group inset>
+            <van-cell title="通过" clickable @click="auditchecked = '2'">
+              <template #right-icon>
+                <van-radio name="2" />
+              </template>
+            </van-cell>
+            <van-cell title="不通过" clickable @click="auditchecked = '3'">
+              <template #right-icon>
+                <van-radio name="3" />
+              </template>
+            </van-cell>
+          </van-cell-group>
+        </van-radio-group>
+        <van-field v-if="auditchecked === '3'" v-model="sh_reason" rows="3" autosize type="textarea" placeholder="填写意见" />
+      </div>
+    </van-dialog>
   </div>
 </template>
 

+ 35 - 55
src/pages/sanZhongYiDa/projectApply/myAuditFor/index.vue

@@ -3,7 +3,7 @@ import { closeToast, showLoadingToast, showToast } from "vant";
 
 const router = useRouter();
 function cellClick(xm_id) {
-  router.push({ path: "/sanZhongYiDa/projectApply/detail", query: { xm_id } });
+  router.push({ path: "/sanZhongYiDa/projectApply/detail", query: { xm_id, type: 'myAuditFor' } });
 }
 
 const listMyAuditFor = ref([]);
@@ -46,10 +46,23 @@ const sh_reason = ref("");
 const operaItem = ref({});
 
 function clickAudit(item) {
-  operaItem.value = item;
-  auditchecked.value = "";
-  sh_reason.value = "";
-  auditDialogShow.value = true;
+  let shjlListArr = item.shjl_list;
+  if (shjlListArr.length != 0) {
+    let firstPStatus = shjlListArr[0].sh_status
+    if (firstPStatus == '2') {//审核过
+      showToast("您已经审批过了");
+    } else {
+      operaItem.value = item;
+      auditchecked.value = "";
+      sh_reason.value = "";
+      auditDialogShow.value = true;
+    }
+  } else {//没有人审核
+    operaItem.value = item;
+    auditchecked.value = "";
+    sh_reason.value = "";
+    auditDialogShow.value = true;
+  }
 }
 function beforeCloseDialog(action) {
   if (action == "confirm") {
@@ -70,7 +83,7 @@ function beforeCloseDialog(action) {
 function dialogSubmit() {
   const transObj = {
     sh_id: operaItem.value.xm_id,
-    sh_status: auditchecked.value, // 待审核 1通过 2驳回
+    sh_status: auditchecked.value, //
     sh_reason: sh_reason.value, // 处理意见
   };
   showLoadingToast({
@@ -93,60 +106,34 @@ function dialogSubmit() {
 </script>
 
 <template>
-  <van-search
-    v-model="param.keyword"
-    :clearable="false"
-    show-action
-    placeholder="请输入搜索关键词"
-    @search="onClickSearch"
-  >
+  <van-search v-model="param.keyword" :clearable="false" show-action placeholder="请输入搜索关键词" @search="onClickSearch">
     <template #action>
       <div @click="onClickSearch">搜索</div>
     </template>
   </van-search>
-  <van-list
-    v-model:loading="loadingMyAuditFor"
-    :finished="finishedMyAuditFor"
-    finished-text="没有更多了"
-    @load="onLoadMyAuditFor"
-  >
-    <van-cell
-      v-for="(item, index) in listMyAuditFor"
-      :key="item"
-      :title="`${index + 1}.\u00A0\u00A0${item.xm_name}`"
-      @click="cellClick(item.xm_id)"
-    >
+  <van-list v-model:loading="loadingMyAuditFor" :finished="finishedMyAuditFor" finished-text="没有更多了"
+    @load="onLoadMyAuditFor">
+    <van-cell v-for="(item, index) in listMyAuditFor" :key="item" :title="`${index + 1}.\u00A0\u00A0${item.xm_name}`"
+      @click="cellClick(item.xm_id)">
       <template #value>
-        <van-button
-          v-if="
-            item.xm_status_option_k == '1' ||
-            item.xm_status_option_k == '2' ||
-            item.xm_status_option_k == '3'
-          "
-          class="rightButton"
-          type="primary"
-          @click.stop="clickAudit(item)"
-        >
+        <van-button v-if="item.xm_status_option_k == '1' ||
+          item.xm_status_option_k == '2' || item.xm_status_option_k === '3'
+          " class="rightButton" type="primary" @click.stop="clickAudit(item)">
           审核
         </van-button>
-        <van-button
-          v-if="item.xm_status_option_k > '3' && item.xm_status_option_k <= '5'"
-          color="#BDBDBD"
-          class="rightButton"
-        >
+        <!-- <van-button v-if="" color="#BDBDBD" class="rightButton">
+          审核中
+        </van-button> -->
+        <van-button v-if="item.xm_status_option_k > '3' && item.xm_status_option_k <= '5'" color="#BDBDBD"
+          class="rightButton">
           已审核
         </van-button>
       </template>
     </van-cell>
   </van-list>
 
-  <van-dialog
-    v-model:show="auditDialogShow"
-    title="审核"
-    confirm-button-text="提交"
-    show-cancel-button
-    :before-close="beforeCloseDialog"
-  >
+  <van-dialog v-model:show="auditDialogShow" title="审核" confirm-button-text="提交" show-cancel-button
+    :before-close="beforeCloseDialog">
     <div class="dialogDiv">
       <van-radio-group v-model="auditchecked">
         <van-cell-group inset>
@@ -162,14 +149,7 @@ function dialogSubmit() {
           </van-cell>
         </van-cell-group>
       </van-radio-group>
-      <van-field
-        v-if="auditchecked === '3'"
-        v-model="sh_reason"
-        rows="3"
-        autosize
-        type="textarea"
-        placeholder="填写意见"
-      />
+      <van-field v-if="auditchecked === '3'" v-model="sh_reason" rows="3" autosize type="textarea" placeholder="填写意见" />
     </div>
   </van-dialog>
 </template>

+ 6 - 19
src/pages/sanZhongYiDa/projectApply/myAudited/index.vue

@@ -19,6 +19,7 @@ function onLoadMyApplyFor() {
       page: pageMyApplyFor,
       limit: 20,
       xm_status: 5,
+      xm_is_wc: 2,
       ...param,
     },
   }).then((res) => {
@@ -41,28 +42,14 @@ function reGetList() {
 </script>
 
 <template>
-  <van-search
-    v-model="param.keyword"
-    :clearable="false"
-    show-action
-    placeholder="请输入搜索关键词"
-    @search="onClickSearch"
-  >
+  <van-search v-model="param.keyword" :clearable="false" show-action placeholder="请输入搜索关键词" @search="onClickSearch">
     <template #action>
       <div @click="onClickSearch">搜索</div>
     </template>
   </van-search>
-  <van-list
-    v-model:loading="loadingMyApplyFor"
-    :finished="finishedMyApplyFor"
-    finished-text="没有更多了"
-    @load="onLoadMyApplyFor"
-  >
-    <van-cell
-      v-for="(item, index) in listMyApplyFor"
-      :key="item"
-      :title="`${index + 1}.\u00A0\u00A0${item.xm_name}`"
-      @click="cellClick(item.xm_id)"
-    />
+  <van-list v-model:loading="loadingMyApplyFor" :finished="finishedMyApplyFor" finished-text="没有更多了"
+    @load="onLoadMyApplyFor">
+    <van-cell v-for="(item, index) in listMyApplyFor" :key="item" :title="`${index + 1}.\u00A0\u00A0${item.xm_name}`"
+      @click="cellClick(item.xm_id)" />
   </van-list>
 </template>

+ 172 - 0
src/pages/tdk/wdkb.vue

@@ -0,0 +1,172 @@
+<script setup lang='ts'>
+import { user } from '~/store/user'
+
+const skzc = ref(1)
+
+const WeekMap = '一二三四五六日'
+const tableData2 = ref<any>({})
+const loading_table2 = ref(false)
+
+async function queryApi2() {
+  loading_table2.value = true
+  tableData2.value = {}
+  await request({
+    url: '/xdjx/kbgl_jskbmx/index',
+    data: { limit: 100, xjj_xm: user.real_name, skzc: skzc.value },
+  }).then((res) => {
+    const d = res.data.page_data
+    // tableData2.value = (Array.from({ length: 8 }).map((_, i) => Array.from({ length: 7 }).map((_, j) => (null))))
+
+    d.forEach((el: any) => {
+      const { skjc, skxq } = el
+      tableData2.value[skjc] = tableData2.value[skjc] ?? {}
+      tableData2.value[skjc][skxq] = el
+    })
+    // alert(JSON.stringify(tableData2.value));
+  }).catch((err) => {
+    console.error(err)
+  }).finally(() => {
+    loading_table2.value = false
+  })
+}
+
+queryApi2()
+
+const columns = Array.from({ length: 8 }).map((_, i) => ({ text: `第${i + 1}周`, value: (i + 1) }))
+const fieldValue = ref('第1周')
+
+const showPicker = ref(false)
+
+function onConfirm({ selectedOptions }) {
+  showPicker.value = false
+  fieldValue.value = selectedOptions[0].text
+  skzc.value = selectedOptions[0].value
+
+  queryApi2()
+}
+</script>
+
+<template>
+  <div class="px-2px mb-32px">
+    <van-field v-model="fieldValue" is-link readonly label="周次" placeholder="选择城市" @click="showPicker = true" />
+  </div>
+
+  <van-popup v-model:show="showPicker" round position="bottom">
+    <van-picker :columns="columns" @cancel="showPicker = false" @confirm="onConfirm" />
+  </van-popup>
+  <div v-if="loading_table2" class="flex_center py-4">
+    <van-loading />
+  </div>
+
+  <div v-else class="my_table">
+    <div class="thead divide-x divide-hex-ccc">
+      <div v-for="i in [1, 2, 3, 4, 5, 6, 7, 8]" :key="i" class="flex_center">
+        {{ i === 1 ? '' : `周${WeekMap[(i - 2)]}` }}
+      </div>
+    </div>
+
+    <div v-loading="loading_table2" class="tbody">
+      <div v-for="(i) in 8" :key="i" class="trow divide-x divide-hex-ccc">
+        <div v-for="j in 8" :key="j" class="tcell h-full">
+          <div v-if="j === 1" class="w-full h-full flex_center">
+            第{{ i }}节
+          </div>
+          <div v-else-if="tableData2?.[i]?.[j - 1]">
+            <div
+              class="h-full px-4px py-2px flex flex-col"
+              :class="tableData2[i][j - 1]?.tkzt_option_k === '3' ? 'text-hex-c0c4cc' : 'text-hex-606266'"
+            >
+              <div class="flex w-full mb-3px">
+                <div class="flex-auto font-bold">
+                  {{ tableData2[i][j - 1]?.subject_name }}
+                </div>
+              </div>
+              <div class="flex-none">
+                <div>{{ tableData2[i][j - 1]?.grade_name }}</div>
+                <div>{{ tableData2[i][j - 1]?.class_name }}</div>
+              </div>
+              <div v-show="tableData2[i][j - 1]?.tkzt_option_k !== '1'" class="flex-none text-10px">
+                {{ tableData2[i][j - 1]?.tkzt }}
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+.flex_center {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.my_table {
+  font-size: 14px;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+
+  .thead {
+    padding: 0 4px;
+    border-top: 1px solid #ccc;
+    border-bottom: 1px solid #ccc;
+    flex: none;
+    width: 100%;
+    height: 60px;
+    // background: rgba(102, 255, 255, 0.20);
+    // color: #66FFFF;
+    display: flex;
+    justify-content: space-around;
+    align-items: center;
+    font-weight: bold;
+
+    &>div {
+      width: 12.5%;
+      height: 100%;
+    }
+  }
+
+  .tbody {
+    padding: 0 4px;
+    font-size: 14px;
+
+    flex: auto;
+    // color: #fff;
+
+    .trow {
+      display: flex;
+      justify-content: space-around;
+      align-items: center;
+      height: 68px;
+      border-bottom: 1px solid #ccc;
+
+      .tcell {
+        width: 12.5%;
+        height: 100%;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+
+        div {
+          font-size: 12px;
+          line-height: 12px;
+        }
+      }
+
+      // &:nth-of-type(2n) {
+      //   background: rgba(102, 255, 255, 0.10);
+      // }
+
+      // &:nth-of-type(2n+1) {
+      //   background: rgba(0, 0, 0, 0.10);
+      // }
+    }
+
+  }
+}
+</style>

+ 27 - 23
src/pages/techerFlowManager/teacherPerformanceAssessment/detailMyApplyFor/index.vue

@@ -1,6 +1,6 @@
 <script setup>
 import { closeToast, showLoadingToast } from 'vant'
-import { download2 } from '~/request/request'
+import { openFile } from '../../../../utils/index'
 
 const { currentRoute } = useRouter()
 const route = currentRoute.value
@@ -22,15 +22,21 @@ request({
   closeToast()
   detailData.value = res.data.one_info
 
-  if (detailData.value.jjmkl_jjmkl_id_1 == 1)
+  if (detailData.value.jjmkl_jjmkl_id_1 == 1) {
     jjtj.value = JSON.parse(res.data.one_info.jjmkl_jjtj_json)
-
-  else if (detailData.value.jjmkl_jjmkl_id_1 == 10)
-
+    for (let item of jjtj.value) {
+      item.file = JSON.parse(item.file)
+    }
+  }
+  else if (detailData.value.jjmkl_jjmkl_id_1 == 10) {
     zbtj.value = JSON.parse(res.data.one_info.jjmkl_zbdffj_json)
+    for (let item of zbtj.value) {
+      item.file = JSON.parse(item.file)
+    }
+  }
 })
-function getFile(url, fileName) {
-  download2(url, null, fileName.split('.')[0])
+function getFile(url) {
+  openFile(url)
 }
 </script>
 
@@ -102,8 +108,9 @@ function getFile(url, fileName) {
                   附件
                 </td>
                 <td>
-                  <span style="color: #1A7AFD;" @click="getFile(item.file.url, item.file.name)">{{ item.file.name
-                  }}</span>
+                  <div v-for="file in item.file" style="color: #1A7AFD;" @click="getFile(file.url)">{{
+                    file.name
+                  }}</div>
                 </td>
               </tr>
             </tbody>
@@ -113,7 +120,7 @@ function getFile(url, fileName) {
               </td>
               <td>
                 <div v-for="f in detailData.jjmkl_sqb_file.split(';')" :key="f">
-                  <span style="color: #1A7AFD;" @click="getFile(f.split('|')[0], f.split('|')[1])">
+                  <span style="color: #1A7AFD;" @click="getFile(f.split('|')[0])">
                     {{ f.split('|')[1]
                     }}
                   </span>
@@ -126,7 +133,7 @@ function getFile(url, fileName) {
               </td>
               <td>
                 <div v-for="f in detailData.jjmkl_lhb_file.split(';')" :key="f">
-                  <span style="color: #1A7AFD;" @click="getFile(f.split('|')[0], f.split('|')[1])">
+                  <span style="color: #1A7AFD;" @click="getFile(f.split('|')[0])">
                     {{ f.split('|')[1]
                     }}
                   </span>
@@ -182,10 +189,9 @@ function getFile(url, fileName) {
                   附件
                 </td>
                 <td>
-                  <span style="color: #1A7AFD;" @click="getFile(item.file.url, item.file.name)">
-                    {{ item.file.name
-                    }}
-                  </span>
+                  <div v-for="file in item.file" style="color: #1A7AFD;" @click="getFile(file.url)">{{
+                    file.name
+                  }}</div>
                 </td>
               </tr>
             </tbody>
@@ -207,10 +213,9 @@ function getFile(url, fileName) {
             <td>
               <div>
                 <span
-                  :class="{ 'text-red': detailData.jjmkl_xdshqk_option_n === '不合格' || detailData.jjmkl_xdshqk_option_n === '不符合' }"
-                >{{
-                  detailData.jjmkl_xdshqk_option_n
-                }}</span>
+                  :class="{ 'text-red': detailData.jjmkl_xdshqk_option_n === '不合格' || detailData.jjmkl_xdshqk_option_n === '不符合' }">{{
+                    detailData.jjmkl_xdshqk_option_n
+                  }}</span>
                 <p v-if="detailData.jjmkl_xdshqk_option_n === '不合格' || detailData.jjmkl_xdshqk_option_n === '不符合'">
                   {{ detailData.jjmkl_xdshqk_clyj }}
                 </p>
@@ -224,10 +229,9 @@ function getFile(url, fileName) {
             <td>
               <div>
                 <span
-                  :class="{ 'text-red': detailData.jjmkl_jdshqk_option_n === '不合格' || detailData.jjmkl_jdshqk_option_n === '不符合' }"
-                >{{
-                  detailData.jjmkl_jdshqk_option_n
-                }}</span>
+                  :class="{ 'text-red': detailData.jjmkl_jdshqk_option_n === '不合格' || detailData.jjmkl_jdshqk_option_n === '不符合' }">{{
+                    detailData.jjmkl_jdshqk_option_n
+                  }}</span>
                 <p v-if="detailData.jjmkl_jdshqk_option_n === '不合格' || detailData.jjmkl_jdshqk_option_n === '不符合'">
                   {{ detailData.jjmkl_jdshqk_clyj }}
                 </p>

+ 31 - 31
src/pages/techerFlowManager/teacherPerformanceAssessment/detailMyAuditFor/index.vue

@@ -1,6 +1,6 @@
 <script setup>
 import { closeToast, showLoadingToast, showToast } from 'vant'
-import { download2 } from '~/request/request'
+import { openFile } from '../../../../utils/index'
 import { userInfo } from '~/store/user'
 
 const { uo_type, user_id } = userInfo
@@ -29,18 +29,24 @@ function getData() {
     closeToast()
     detailData.value = res.data.one_info
 
-    if (detailData.value.jjmkl_jjmkl_id_1 == 1)
+    if (detailData.value.jjmkl_jjmkl_id_1 == 1) {
       jjtj.value = JSON.parse(res.data.one_info.jjmkl_jjtj_json)
-
-    else if (detailData.value.jjmkl_jjmkl_id_1 == 10)
-
+      for (let item of jjtj.value) {
+        item.file = JSON.parse(item.file)
+      }
+    }
+    else if (detailData.value.jjmkl_jjmkl_id_1 == 10) {
       zbtj.value = JSON.parse(res.data.one_info.jjmkl_zbdffj_json)
+      for (let item of zbtj.value) {
+        item.file = JSON.parse(item.file)
+      }
+    }
   })
 }
 getData()
 
-function getFile(url, fileName) {
-  download2(url, null, fileName.split('.')[0])
+function getFile(url) {
+  openFile(url)
 }
 
 const auditOptions10 = [{
@@ -211,8 +217,9 @@ function dialogSubmit() {
                   附件
                 </td>
                 <td>
-                  <span style="color: #1A7AFD;" @click="getFile(item.file.url, item.file.name)">{{ item.file.name
-                  }}</span>
+                  <div v-for="file in item.file" style="color: #1A7AFD;" @click="getFile(file.url)">{{
+                    file.name
+                  }}</div>
                 </td>
               </tr>
             </tbody>
@@ -222,7 +229,7 @@ function dialogSubmit() {
               </td>
               <td>
                 <div v-for="f in detailData.jjmkl_sqb_file.split(';')" :key="f">
-                  <span style="color: #1A7AFD;" @click="getFile(f.split('|')[0], f.split('|')[1])">
+                  <span style="color: #1A7AFD;" @click="getFile(f.split('|')[0])">
                     {{ f.split('|')[1]
                     }}
                   </span>
@@ -235,7 +242,7 @@ function dialogSubmit() {
               </td>
               <td>
                 <div v-for="f in detailData.jjmkl_lhb_file.split(';')" :key="f">
-                  <span style="color: #1A7AFD;" @click="getFile(f.split('|')[0], f.split('|')[1])">
+                  <span style="color: #1A7AFD;" @click="getFile(f.split('|')[0])">
                     {{ f.split('|')[1]
                     }}
                   </span>
@@ -291,10 +298,9 @@ function dialogSubmit() {
                   附件
                 </td>
                 <td>
-                  <span style="color: #1A7AFD;" @click="getFile(item.file.url, item.file.name)">
-                    {{ item.file.name
-                    }}
-                  </span>
+                  <div v-for="file in item.file" style="color: #1A7AFD;" @click="getFile(file.url)">{{
+                    file.name
+                  }}</div>
                 </td>
               </tr>
             </tbody>
@@ -316,10 +322,9 @@ function dialogSubmit() {
             <td>
               <div v-if="detailData.jjmkl_xdshqk !== '2'">
                 <span
-                  :class="{ 'text-red': detailData.jjmkl_xdshqk_option_n === '不合格' || detailData.jjmkl_xdshqk_option_n === '不符合' }"
-                >{{
-                  detailData.jjmkl_xdshqk_option_n
-                }}</span>
+                  :class="{ 'text-red': detailData.jjmkl_xdshqk_option_n === '不合格' || detailData.jjmkl_xdshqk_option_n === '不符合' }">{{
+                    detailData.jjmkl_xdshqk_option_n
+                  }}</span>
                 <p v-if="detailData.jjmkl_xdshqk_option_n === '不合格' || detailData.jjmkl_xdshqk_option_n === '不符合'">
                   {{ detailData.jjmkl_xdshqk_clyj }}
                 </p>
@@ -338,10 +343,9 @@ function dialogSubmit() {
             <td>
               <div v-if="detailData.jjmkl_jdshqk !== '2'">
                 <span
-                  :class="{ 'text-red': detailData.jjmkl_jdshqk_option_n === '不合格' || detailData.jjmkl_jdshqk_option_n === '不符合' }"
-                >{{
-                  detailData.jjmkl_jdshqk_option_n
-                }}</span>
+                  :class="{ 'text-red': detailData.jjmkl_jdshqk_option_n === '不合格' || detailData.jjmkl_jdshqk_option_n === '不符合' }">{{
+                    detailData.jjmkl_jdshqk_option_n
+                  }}</span>
                 <p v-if="detailData.jjmkl_jdshqk_option_n === '不合格' || detailData.jjmkl_jdshqk_option_n === '不符合'">
                   {{ detailData.jjmkl_jdshqk_clyj }}
                 </p>
@@ -356,10 +360,8 @@ function dialogSubmit() {
         </table>
       </div>
     </div>
-    <van-dialog
-      v-model:show="auditDialogShow" title="审核" confirm-button-text="提交" show-cancel-button
-      :before-close="beforeCloseDialog"
-    >
+    <van-dialog v-model:show="auditDialogShow" title="审核" confirm-button-text="提交" show-cancel-button
+      :before-close="beforeCloseDialog">
       <div class="dialogDiv">
         <van-radio-group v-model="auditchecked">
           <van-cell-group inset>
@@ -370,10 +372,8 @@ function dialogSubmit() {
             </van-cell>
           </van-cell-group>
         </van-radio-group>
-        <van-field
-          v-if="auditchecked === '5' || auditchecked === '7'" v-model="jjmkl_jdshqk_clyj" rows="3" autosize
-          type="textarea" placeholder="填写意见"
-        />
+        <van-field v-if="auditchecked === '5' || auditchecked === '7'" v-model="jjmkl_jdshqk_clyj" rows="3" autosize
+          type="textarea" placeholder="填写意见" />
       </div>
     </van-dialog>
   </div>

Разница между файлами не показана из-за своего большого размера
+ 100 - 1
src/store/local/la.js


Разница между файлами не показана из-за своего большого размера
+ 90 - 0
src/store/produ/la.js


Разница между файлами не показана из-за своего большого размера
+ 102 - 0
src/store/produ/lwj.js


Разница между файлами не показана из-за своего большого размера
+ 97 - 0
src/store/produ/zlh1388.js


Разница между файлами не показана из-за своего большого размера
+ 97 - 0
src/store/produ/zlh1391.js


+ 9 - 7
src/store/user.js

@@ -1,15 +1,17 @@
 import { defineStore } from 'pinia'
-// import local from './local/la'
+
+// import produ from './produ/lwj'
+
 // localStorage.setItem(
 //   'userInfo',
-//   JSON.stringify(local),
+//   JSON.stringify(produ),
 // )
 
-const RoleMap = {
-  JLD: [1, 2, 3],
-  ZJ: [4, 5, 6],
-  JYZ: [7, 8],
-}
+// const RoleMap = {
+//   JLD: [1, 2, 3],
+//   ZJ: [4, 5, 6],
+//   JYZ: [7, 8],
+// }
 export const userInfo = JSON.parse(localStorage.getItem('userInfo'))
 const {
   token,

+ 5 - 0
src/styles/main.scss

@@ -21,3 +21,8 @@ html.dark {
   border-bottom: 2px solid #666;
   border-top: 2px solid #666;
 }
+
+// 解决苹果手机点击input框放大的问题
+input {
+  font-size: 16px !important;
+}

+ 26 - 0
src/utils/index.js

@@ -0,0 +1,26 @@
+import * as dd from 'dingtalk-jsapi'
+
+function getFullUrl(url) {
+  if (!url)
+    return ''
+  if (url.includes('60.188.226.44:8090')) {
+    url = url.replace('60.188.226.44:8090', 'jnjymf.bozedu.net')
+  }
+  return url.startsWith('http') ? url : `http://jnjymf.bozedu.net/${url}`
+}
+const previewUrl = 'https://view.officeapps.live.com/op/view.aspx?src='
+export function openFile(url) {
+  let showUrl = getFullUrl(url)
+  let suffix = showUrl.substr(showUrl.lastIndexOf('.') + 1).toLowerCase()
+
+  if (suffix == 'mp3' || suffix == 'mp4' || suffix == 'pdf' || suffix == 'jpg' || suffix == 'jpeg' || suffix == 'png') {
+    dd.biz.util.openLink({
+      url: showUrl,//要打开链接的地址
+    })
+  }
+  else {
+    dd.biz.util.openLink({
+      url: previewUrl + showUrl,//要打开链接的地址
+    })
+  }
+}