Selaa lähdekoodia

Merge branch 'master' into bzkf30

bzkf30 1 vuosi sitten
vanhempi
commit
3f3a855dc4

+ 3 - 1
src/App.vue

@@ -1,5 +1,7 @@
 <template>
   <main>
-    <RouterView style="background-color: white;min-height: 100vh;" />
+    <Suspense>
+      <RouterView style="background-color: white;min-height: 100vh;" />
+    </Suspense>
   </main>
 </template>

BIN
src/assets/index/qjgl.png


BIN
src/assets/index/shgl.png


BIN
src/assets/index/wcgl.png


BIN
src/assets/index/wdkb.png


BIN
src/assets/index/wdtdk.png


BIN
src/assets/index/xsewm.png


BIN
src/assets/index/yygl.png


+ 123 - 0
src/components/RemoteList/index.vue

@@ -0,0 +1,123 @@
+<script setup>
+const props = defineProps({
+  url: {
+    type: String,
+    required: true,
+  },
+  d: {
+    type: Object,
+    required: false,
+  },
+  k: {
+    type: String,
+    required: false,
+  },
+})
+
+let page = 1
+
+let loading = $ref(false)
+let error = $ref(false)
+let finished = $ref(false)
+let refreshing = $ref(false)
+
+let list = $ref([])
+
+// request({
+//   url: props.url,
+//   data: {
+//     page,
+//     ...props.d
+//   },
+// })
+
+function onLoad() {
+  loading = true
+  request({
+    url: props.url,
+    data: {
+      page,
+      ...props.d,
+    },
+  }).then((res) => {
+    if (res.code === '1') {
+      if (refreshing) {
+        list = []
+        refreshing = false
+      }
+      list = list.concat(res.data.page_data)
+      loading = false
+      page++
+      if (res.data.page_now === res.data.total_page)
+        finished = true
+    }
+    else {
+      error = true
+    }
+  }).catch((err) => {
+    console.log(err)
+  })
+}
+
+function onRefresh() {
+  finished = false
+  page = 1
+  refreshing = true
+  onLoad()
+}
+
+let timer
+
+onBeforeUnmount(() => {
+  timer && clearInterval(timer)
+})
+
+function debounce(fn, delay) {
+  return function () {
+    console.log('debounce')
+    const context = this
+    const args = arguments
+    clearTimeout(timer)
+    timer = setTimeout(() => {
+      fn.apply(context, args)
+    }, delay)
+  }
+}
+
+watch(
+  () => props.d,
+  debounce((val, oldVal) => {
+    // console.log('val : ', val)
+    if (props.k) {
+      if (val[props.k] === oldVal[props.k])
+        return
+    }
+
+    page = 1
+    refreshing = true
+    onLoad()
+  }, 400),
+  {
+    deep: true,
+  },
+)
+
+defineExpose({
+  refresh: () => {
+    onRefresh()
+  },
+})
+</script>
+
+<template>
+  <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
+    <van-list
+      v-model:loading="loading" v-model:error="error" error-text="请求失败,点击重新加载" :finished="finished"
+      finished-text="没有更多了" @load="onLoad" @click.stop
+    >
+      <template v-for="item in list">
+        <slot :row="item" />
+      </template>
+    </van-list>
+  </van-pull-refresh>
+</template>

+ 6 - 0
src/main.ts

@@ -2,9 +2,14 @@ import { createApp } from 'vue'
 import { createPinia } from 'pinia'
 import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
 import router from './router/index'
+import { ImagePreview } from 'vant';
 import App from './App.vue'
 import 'vant/es/toast/style'
 import 'vant/es/dialog/style'
+import 'vant/lib/index.css'
+
+
+
 import 'amfe-flexible'
 
 import 'virtual:windi.css'
@@ -19,3 +24,4 @@ pinia.use(piniaPluginPersistedstate)
 app.use(pinia)
 app.use(router)
 app.mount('#app')
+app.use(ImagePreview)

+ 45 - 0
src/pages/administrativeService/leaveManagement/apiItem.js

@@ -0,0 +1,45 @@
+import request from '~/utils/request';
+//列表数据
+export const queryApi = (data = {}) =>
+  request({
+    url: '/xdbg/xzfw_qjgl/index',
+    data
+  });
+// 添加接口
+export const addApi = (data = {}) => request({
+  url: '/xdbg/xzfw_qjgl/add',
+  data: { xdbg_xzfw_qjgl: data }
+});
+//编辑接口
+export const editApi = (chooseId, data = {}) => request({
+  url: '/xdbg/xzfw_qjgl/edit',
+  data: { xxq_id: chooseId, xdbg_xzfw_qjgl: data }
+});
+//详情接口
+export const detailApi = (chooseId) => request({
+  url: '/xdbg/xzfw_qjgl/detail',
+  data: { xxq_id: chooseId }
+});
+//删除接口
+export const deleteApi = (chooseId) => request({
+  url: '/xdbg/xzfw_qjgl/delete',
+  data: { xxq_id: chooseId }
+});
+//搜索接口
+export const searchApi = (keyIn_keyword) => request({
+  url: '/xdbg/xzfw_qjgl/index',
+  data: keyIn_keyword
+})
+
+//通用-科室列表(组织机构use_org)
+export const org_list = (data = {}) =>
+  request({
+    url: '/user/org/index',
+    data
+  });
+//用户列表
+export const org_users = (data) =>
+  request({
+    url: '/user/main/index',
+    data
+  })

+ 313 - 0
src/pages/administrativeService/leaveManagement/index.vue

@@ -0,0 +1,313 @@
+<<<<<<< HEAD
+<template>
+  <div>
+2222
+  </div>
+</template>
+
+<script setup>
+
+</script>
+
+<style lang="scss" scoped>
+
+=======
+<script setup >
+import {ref} from 'vue';
+import {userInfo} from '~/store/user';
+const {uo_type,user_id,uo_id} = userInfo
+import {queryApi,org_users} from './apiItem';
+
+const isBureau = ref(false) // 当前用户是否局端
+isBureau.value = uo_type === '1'
+/***************************请假管理*******************************************/
+
+//外出管理-返回
+const onClickLeft = () => history.back();
+
+const tabActive = ref(0);
+
+const applyType = ref();
+const applyTypeOption = ref([
+  { text: '请假类型', value: '' },
+  { text: '事假', value: 1 },
+  { text: '病假', value: 2 },
+  { text: '婚假', value: 3 },
+  { text: '丧假', value: 4 },
+  { text: '产假', value: 5 },
+  { text: '年休假', value: 6 },
+  { text: '调休', value: 7 },
+  { text: '其他', value: 8 },
+]);
+const applyReason = ref();
+
+
+const tableList = ref([])
+const loading = ref(false)
+const finished = ref(false)
+
+const onLoad = () => {
+  // 异步更新数据
+  // setTimeout 仅做示例,真实场景中一般为 ajax 请求
+  setTimeout(() => {
+    for (let i = 0; i < 10; i++) {
+      list.value.push(list.value.length + 1);
+    }
+
+    // 加载状态结束
+    loading.value = false;
+
+    // 数据全部加载完成
+    if (list.value.length >= 40) {
+      finished.value = true;
+    }
+  }, 1000);
+
+  let transObjs = {
+    page:1
+  }
+  queryApi(transObjs)
+  .then(res => {
+    tableList.value = res.data.page_data;
+    if (tableList.value.length >= res.data.total_rows) {
+      finished.value = true;
+    }
+
+  })
+  .catch(error => {
+    console.log(error)
+  })
+};
+
+const onSubmit = () => {
+  show.value = true;
+}
+
+const show = ref(false);
+
+const value1 = ref('');
+const value2 = ref('');
+const value3 = ref('abc');
+const value4 = ref('');
+const pattern = /\d{6}/;
+
+// 校验函数返回 true 表示校验通过,false 表示不通过
+const validator = (val) => /1\d{10}/.test(val);
+
+// 校验函数可以直接返回一段错误提示
+const validatorMessage = (val) => `${val} 不合法,请重新输入`;
+
+// 校验函数可以返回 Promise,实现异步校验
+const asyncValidator = (val) =>
+  new Promise((resolve) => {
+    showLoadingToast('验证中...');
+
+    setTimeout(() => {
+      closeToast();
+      resolve(val === '1234');
+    }, 1000);
+  });
+
+const onFailed = (errorInfo) => {
+  console.log('failed', errorInfo);
+};
+
+/***************************请假审批*******************************************/
+const applyPerson = ref();
+
+const userLIST = ref([]);
+//获取用户列表
+const getUserList=()=> {
+  let transObjs = {
+    dept_id: uo_id,
+    page: 1,
+    limit: 99999,
+  };
+  org_users(transObjs).then((res) => {
+    if (res.code == 1) {
+      let tempArr = [];
+      res.data.page_data.forEach(item => {
+        tempArr.push({
+          text: item.user_realname,
+          value:item.user_id,
+        })
+      })
+      userLIST.value = tempArr;
+    }
+  });
+}
+getUserList();
+
+
+const handleCheckDialog = (item) => {
+  if (user_id == item.xxq_spr_user_id) {
+    this.dialogCheckVisible = true;
+    this.curCheckId = row.xxq_id;
+  } else {
+    showNotify({ type: 'warning', message: '此条申请,您无法审核~' });
+    return
+  }
+}
+
+
+</script>
+
+<template>
+<div class="leaveMag">
+  <div v-show="isBureau">
+    <div style="width: 100%;text-align: center;"><span style="font-size: 20px;">本功能仅对校端用户开放</span></div>
+  </div>
+  <div class="index" v-show="!isBureau">
+    <van-nav-bar title="请假管理" left-text="返回" left-arrow @click-left="onClickLeft"/>
+
+    <van-tabs v-model:active="tabActive">
+      <van-tab title="请假管理">
+
+        <van-dropdown-menu>
+          <van-dropdown-item v-model="applyType" title="请假类型" :options="applyTypeOption"  @change="dropItemChange" />
+          <van-dropdown-item ref="itemRef2" title="请假事由">
+            <van-cell-group inset>
+              <van-field v-model="applyReason" placeholder="请输入请假事由" />
+            </van-cell-group>
+            <div style="padding: 5px 16px;">
+              <van-button type="primary" block round @click="onConfirm(0)">
+                确认
+              </van-button>
+            </div>
+          </van-dropdown-item>
+        </van-dropdown-menu>
+
+        <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+          <van-cell v-for="(item,index ) in tableList" :key="index" :title="item" >
+            <template #title>
+              <div>申请时间:{{ item.xxq_sqsj }}</div>
+              <div>请假人:{{ item.xxq_qjr }}</div>
+            </template>
+            <template #label>
+              <div>开始时间:{{ item.xxq_kssj }}</div>
+              <div>结束时间:{{ item.xxq_jssj }}</div>
+              <div>请假时长(天):{{ item.xxq_qjsc }}</div>
+              <div>状态:
+                <span :class="item.xxq_zt_option_k == '1' ? 'greenText' : (item.xxq_zt_option_k == '3' ? 'redText' : '')" >{{ item.xxq_zt }}</span>
+              </div>
+            </template>
+
+          </van-cell>
+        </van-list>
+
+        <van-submit-bar  button-text="请假申请" @submit="onSubmit" />
+
+        <van-dialog v-model:show="show" title="请假申请" confirmButtonDisabled="false">
+          <van-form @failed="onFailed">
+            <van-cell-group inset>
+              <!-- 通过 pattern 进行正则校验 -->
+              <van-field
+                v-model="value1"
+                name="申请时间"
+                label="申请时间"
+                placeholder="正则校验"
+                :rules="[{ pattern, message: '请输入正确内容' }]"
+              />
+              <!-- 通过 validator 进行函数校验 -->
+              <van-field
+                v-model="value2"
+                name="请假人:"
+                label="请假人:"
+                placeholder="函数校验"
+                :rules="[{ validator, message: '请输入正确内容' }]"
+              />
+              <!-- 通过 validator 返回错误提示 -->
+              <van-field
+                v-model="value3"
+                name="validatorMessage"
+                placeholder="校验函数返回错误提示"
+                :rules="[{ validator: validatorMessage }]"
+              />
+              <!-- 通过 validator 进行异步函数校验 -->
+              <van-field
+                v-model="value4"
+                name="asyncValidator"
+                placeholder="异步函数校验"
+                :rules="[{ validator: asyncValidator, message: '请输入正确内容' }]"
+              />
+            </van-cell-group>
+            <div style="margin: 16px;">
+              <van-button round block type="primary" native-type="submit">
+                提交
+              </van-button>
+            </div>
+          </van-form>
+
+        </van-dialog>
+
+      </van-tab>
+      <van-tab title="请假审批">
+        <van-dropdown-menu>
+          <van-dropdown-item v-model="applyType" title="请假类型" :options="applyTypeOption"  />
+          <van-dropdown-item v-model="applyPerson" title="申请人" :options="userLIST"  />
+          <van-dropdown-item ref="itemRef2" title="请假事由">
+            <van-cell-group inset>
+              <van-field v-model="applyReason" placeholder="请输入请假事由" />
+            </van-cell-group>
+            <div style="padding: 5px 16px;">
+              <van-button type="primary" block round @click="onConfirm(0)">
+                确认
+              </van-button>
+            </div>
+          </van-dropdown-item>
+        </van-dropdown-menu>
+
+        <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+          <van-cell v-for="(item,index) in tableList" :key="index" :title="item" >
+            <template #title>
+              <div>申请时间:{{ item.xxq_sqsj }}</div>
+              <div>请假人:{{ item.xxq_qjr }}</div>
+            </template>
+            <template #label>
+              <div>开始时间:{{ item.xxq_kssj }}</div>
+              <div>结束时间:{{ item.xxq_jssj }}</div>
+              <div>请假时长(天):{{ item.xxq_qjsc }}</div>
+              <div>请假事由:{{ item.xxq_qjsy }}</div>
+
+            </template>
+
+            <template #right-icon>
+              <van-button type="primary" size="small" @click="handleCheckDialog(item)">审核</van-button>
+            </template>
+          </van-cell>
+        </van-list>
+
+      </van-tab>
+    </van-tabs>
+
+
+
+
+
+
+  </div>
+</div>
+</template>
+
+<style lang="scss" scoped>
+.vant-table-container {
+  width: 100%;
+  padding: 20px;
+  box-sizing: border-box;
+}
+
+.even-row {
+  background-color: #f7f7f7;
+}
+
+.odd-row {
+  background-color: #ffffff;
+}
+.greenText{
+  color: green;
+}
+.redText{
+  color: red;
+}
+>>>>>>> liua
+</style>

+ 45 - 0
src/pages/administrativeService/outManagement/apiItem.js

@@ -0,0 +1,45 @@
+import request from '@/utils/request';
+//列表数据
+export const queryApi = (choosePage, data = {}) =>
+  request({
+    url: '/xdbg/xzfw_wcgl/index',
+    data: { limit: 10, page: choosePage },
+  });
+// 添加接口
+export const addApi = (data = {}) => request({
+  url: '/xdbg/xzfw_wcgl/add',
+  data: { xdbg_xzfw_wcgl: data }
+});
+//编辑接口
+export const editApi = (chooseId, data = {}) => request({
+  url: '/xdbg/xzfw_wcgl/edit',
+  data: { xxw_id: chooseId, xdbg_xzfw_wcgl: data }
+});
+//详情接口
+export const detailApi = (chooseId) => request({
+  url: '/xdbg/xzfw_wcgl/detail',
+  data: { xxw_id: chooseId }
+});
+//删除接口
+export const deleteApi = (chooseId) => request({
+  url: '/xdbg/xzfw_wcgl/delete',
+  data: { xxw_id: chooseId }
+});
+//搜索接口
+export const searchApi = (keyIn_keyword) => request({
+  url: '/xdbg/xzfw_wcgl/index',
+  data: keyIn_keyword
+});
+
+//用户列表
+export const org_users = (data = {}) =>
+  request({
+    url: '/user/main/index',
+    data: {
+      dept_id: data.dept_id,
+      all: '1',
+      page: data.page,
+      limit: data.limit
+
+    }
+  })

+ 46 - 0
src/pages/administrativeService/outManagement/index.vue

@@ -0,0 +1,46 @@
+<<<<<<< HEAD
+<template>
+  <div>
+1111333333
+  </div>
+</template>
+
+<script setup>
+
+</script>
+
+<style lang="scss" scoped>
+
+</style>
+=======
+<script>
+import { ref } from "vue";
+import { userInfo } from "~/store/user";
+const { uo_type } = userInfo;
+import { queryApi } from "./apiItem";
+
+const isBureau = ref(false); // 当前用户是否局端
+isBureau.value = uo_type === "1";
+
+//外出管理-返回
+const onClickLeft = () => history.back();
+
+
+</script>
+
+<template>
+  <div class="outMag">
+    <div v-show="isBureau">
+      <div style="width: 100%; text-align: center">
+        <span style="font-size: 20px">本功能仅对校端用户开放</span>
+      </div>
+    </div>
+    <div class="index" v-show="!isBureau">
+      <van-nav-bar title="外出管理" left-text="返回" left-arrow @click-left="onClickLeft"/>
+
+    </div>
+  </div>
+</template>
+
+<style lang="scss" scoped></style>
+>>>>>>> liua

+ 1 - 1
src/pages/borrowReceive/schoolPropertyList/index.vue

@@ -121,7 +121,7 @@ function dropItemChange() {
         <template #label>
           <div><span>资产分类:{{ item.xhx_zcfl }}</span></div>
           <div style="color: black;">
-            <div><span>{{ `状态:${item.xhx_zt}\u00A0\u00A0\u00A0单价${item.xhx_dj}` }}</span></div>
+            <div><span>{{ `状态:${item.xhx_zt}\u00A0\u00A0\u00A0单价${item.xhx_dj}` }}</span></div>
             <div><span>审批人:{{ item.xhx_spr }}</span></div>
           </div>
         </template>

+ 27 - 1
src/pages/menuData.js

@@ -70,6 +70,8 @@ export const menuList = [
     title: '行政服务',
     list: [
       { icon: getAssetsImages('index/jslswc.png'), menuName: '教师临时外出', path: '/administrativeService/teacherTempGoOut' },
+      { icon: getAssetsImages('index/qjgl.png'), menuName: '请假管理', path: '/administrativeService/leaveManagement' },
+      { icon: getAssetsImages('index/wcgl.png'), menuName: '外出管理', path: '/administrativeService/outManagement' },
     ],
   },
   {
@@ -93,7 +95,7 @@ export const menuList = [
   //     { icon: getAssetsImages('index/tjtj.png'), menuName: '提交统计' },
   //   ],
   // },
-   {
+  {
     tag: 'cjxt',
     title: '晨检系统',
     list: [
@@ -121,4 +123,28 @@ export const menuList = [
       { icon: getAssetsImages('index/xmlcgl.png'), menuName: '校内申购', path: '/equipmentPurchase' },
     ],
   },
+  {
+    tag: 'tdk',
+    title: '调代课',
+    list: [
+      { icon: getAssetsImages('index/wdkb.png'), menuName: '我的课表', path: '/tdk/wdkb' },
+      { icon: getAssetsImages('index/wdtdk.png'), menuName: '我的调代课', path: '/tdk/wdtdk' },
+    ],
+  },
+  {
+    tag: 'zyyy',
+    title: '资源预约',
+    list: [
+      { icon: getAssetsImages('index/yygl.png'), menuName: '预约管理', path: '/resourceOrder/orderManager' },
+      { icon: getAssetsImages('index/shgl.png'), menuName: '审核管理', path: '/resourceOrder/auditManager' },
+    ],
+  },
+  {
+    tag: 'wypj',
+    title: '五育评价',
+    list: [
+      { icon: getAssetsImages('index/xsewm.png'), menuName: '学生二维码', path: '/wuYuAppraise/studentQR' },
+
+    ],
+  },
 ]

+ 230 - 0
src/pages/resourceOrder/auditManager/index.vue

@@ -0,0 +1,230 @@
+<script setup>
+import { closeToast, showLoadingToast, showToast } from "vant";
+import { userInfo } from '~/store/user'
+
+const { uo_type } = userInfo
+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({
+  keyword: '',
+  xhz_cdmc: '',
+  xhz_ssbm: '',
+  xhz_jyr: '',
+  xhz_pzr: '',
+  xhz_zt: ''
+})
+function onLoad() {
+  loading.value = true
+  request({
+    url: '/xdhq/hqgl_zyyy/index',
+    method: 'post',
+    data: {
+      ...param,
+      page,
+      limit: 20,
+    },
+  }).then((res) => {
+    const data = res.data
+    list.value = [...list.value, ...data.page_data]
+    finished.value = data.total_page === page
+    page++
+    loading.value = false
+  })
+}
+function onClickSearch() {
+  reGetList()
+}
+const itemRef1 = ref(null)
+const itemRef2 = ref(null)
+const itemRef3 = ref(null)
+const itemRef4 = ref(null)
+function onConfirm(num) {
+  let temp = [itemRef1, itemRef2, itemRef3, itemRef4]
+  temp[num].value.toggle()
+  reGetList()
+}
+function reGetList() {
+  page = 1
+  list.value = []
+  finished.value = false
+  onLoad()
+}
+
+const statusOption = $ref([{ text: '状态', value: '' }, { text: '通过', value: '1' }, { text: '未通过', value: '2' }, { text: '待审核', value: '3' }])
+function dropItemChange() {
+  reGetList()
+}
+
+const auditDialogShow = ref(false);
+const auditchecked = ref("");
+const xhz_yy = ref('')
+let operaItem = {}
+
+function audit(item) {
+  operaItem = item
+  auditDialogShow.value = true
+}
+function beforeCloseDialog(action) {
+  if (action == "confirm") {
+    if (auditchecked.value == "") {
+      showToast("请选择审核结果");
+      return false;
+    } else if (auditchecked.value === "2" && xhz_yy.value == "") {
+      showToast("请填写意见");
+      return false;
+    } else {
+      dialogSubmit();
+      return true;
+    }
+  } else {
+    return true;
+  }
+}
+function dialogSubmit() {
+  const transObj = {
+    xhz_id: operaItem.xhz_id,
+    xdhq_hqgl_zyyy: {
+      xhz_zt: auditchecked.value, // 待审核 1通过 2驳回
+      xhz_yy: xhz_yy.value, // 处理意见
+    },
+  };
+  showLoadingToast({
+    message: "提交中...",
+    forbidClick: true,
+  });
+  request({
+    url: "/xdhq/hqgl_zyyy/edit",
+    data: transObj,
+  }).then((res) => {
+    closeToast();
+    if (res.code == 1) {
+      showToast(res.msg);
+      list.value = [];
+      page = 1;
+      onLoad();
+    }
+  });
+}
+</script>
+
+<template>
+  <div v-show="isBureau">
+    <div style="width: 100%;text-align: center;"><span style="font-size: 20px;">本功能仅对校端用户开放</span></div>
+  </div>
+  <div class="index" v-show="!isBureau">
+    <van-search v-model="param.keyword" :clearable="false" show-action placeholder="请输入搜索关键词" @search="onClickSearch">
+      <template #action>
+        <div @click="onClickSearch">
+          搜索
+        </div>
+      </template>
+    </van-search>
+    <van-dropdown-menu>
+      <van-dropdown-item ref="itemRef1" title="场地名称">
+        <van-cell-group inset>
+          <van-field v-model="param.xhz_cdmc" placeholder="请输入场地名称" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onConfirm(0)">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+
+      <van-dropdown-item ref="itemRef2" title="所属部门">
+        <van-cell-group inset>
+          <van-field v-model="param.xhz_ssbm" placeholder="请输入所属部门" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onConfirm(1)">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+      <van-dropdown-item ref="itemRef3" title="借用人">
+        <van-cell-group inset>
+          <van-field v-model="param.xhz_jyr" placeholder="请输入借用人" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onConfirm(2)">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+      <van-dropdown-item ref="itemRef4" title="批准人">
+        <van-cell-group inset>
+          <van-field v-model="param.xhz_pzr" placeholder="请输入批准人" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onConfirm(3)">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+      <van-dropdown-item v-model="param.xhz_zt" :options="statusOption" @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">
+        <template #title>
+          <span>{{ `${item.xhz_cdmc}` }}</span>
+        </template>
+        <template #value>
+          <div>
+            <van-button class="w-60px" type="primary" size="small" @click="audit(item)"
+              v-show="item.xhz_zt_option_k == 3">审核</van-button>
+          </div>
+        </template>
+        <template #label>
+          <div><span>{{ `所属部门:${item.xhz_ssbm}\u00A0\u00A0\u00A0状态:${item.xhz_zt}` }}</span></div>
+          <div style="color: black;">
+            <div><span>{{ `借用人:${item.xhz_jyr}\u00A0\u00A0\u00A0批准人:${item.xhz_pzr}` }}</span>
+            </div>
+            <div><span>借用时间:{{ item.xhz_jysj_ks + '至' + item.xhz_jysj_js }}</span></div>
+          </div>
+        </template>
+      </van-cell>
+    </van-list>
+
+    <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 = '1'">
+              <template #right-icon>
+                <van-radio name="1" />
+              </template>
+            </van-cell>
+            <van-cell title="不通过" clickable @click="auditchecked = '2'">
+              <template #right-icon>
+                <van-radio name="2" />
+              </template>
+            </van-cell>
+          </van-cell-group>
+        </van-radio-group>
+        <van-field v-if="auditchecked === '2'" v-model="xhz_yy" rows="3" autosize type="textarea" placeholder="填写原因" />
+      </div>
+    </van-dialog>
+  </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-ellipsis) {
+  font-size: 14px !important;
+}
+</style>

+ 175 - 0
src/pages/resourceOrder/orderManager/index.vue

@@ -0,0 +1,175 @@
+<script setup>
+import { userInfo } from '~/store/user'
+import { showImagePreview } from 'vant';
+
+const { uo_type } = userInfo
+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({
+  keyword: '',
+  xhzz_cdbh: '',
+  xhzz_cdmc: '',
+  xhzl_flbm: '',
+  xhzz_fzr: ''
+})
+function onLoad() {
+  loading.value = true
+  request({
+    url: '/xdhq/hqgl_zyyyzy/index',
+    method: 'post',
+    data: {
+      ...param,
+      page,
+      limit: 20,
+    },
+  }).then((res) => {
+    const data = res.data
+    list.value = [...list.value, ...data.page_data]
+    finished.value = data.total_page === page
+    page++
+    loading.value = false
+  })
+}
+function onClickSearch() {
+  reGetList()
+}
+const itemRef1 = ref(null)
+const itemRef2 = ref(null)
+const itemRef3 = ref(null)
+const itemRef4 = ref(null)
+function onConfirm(num) {
+  let temp = [itemRef1, itemRef2, itemRef3, itemRef4]
+  temp[num].value.toggle()
+  reGetList()
+}
+function reGetList() {
+  page = 1
+  list.value = []
+  finished.value = false
+  onLoad()
+}
+const router = useRouter()
+function order(item) {
+  router.push({
+    path: "/resourceOrder/orderManager/orderFrom",
+    query: { xhzz_id: item.xhzz_id },
+  });
+}
+const placeCategoryOption = $ref([{ text: '场地类别', value: '' }])
+request({
+  url: '/xdhq/hqgl_zyyylb/index', data: {
+    page: 1,
+    limit: 9999
+  }
+}).then(res => {
+  for (let item of res.data.page_data) {
+    placeCategoryOption.push({ text: item.xhzl_flmc, value: item.xhzl_flbm })
+  }
+})
+function dropItemChange() {
+  reGetList()
+}
+
+
+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}`
+}
+
+function previewImg(url) {
+  showImagePreview([url]);
+}
+</script>
+
+<template>
+  <div v-show="isBureau">
+    <div style="width: 100%;text-align: center;"><span style="font-size: 20px;">本功能仅对校端用户开放</span></div>
+  </div>
+  <div class="index" v-show="!isBureau">
+    <van-search v-model="param.keyword" :clearable="false" show-action placeholder="请输入搜索关键词" @search="onClickSearch">
+      <template #action>
+        <div @click="onClickSearch">
+          搜索
+        </div>
+      </template>
+    </van-search>
+    <van-dropdown-menu>
+      <van-dropdown-item ref="itemRef1" title="场地编号">
+        <van-cell-group inset>
+          <van-field v-model="param.xhzz_cdbh" placeholder="请输入场地编号" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onConfirm(0)">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+
+      <van-dropdown-item ref="itemRef3" title="场地名称">
+        <van-cell-group inset>
+          <van-field v-model="param.xhzz_cdmc" placeholder="请输入场地名称" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onConfirm(2)">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+      <van-dropdown-item v-model="param.xhzl_flbm" :options="placeCategoryOption" @change="dropItemChange" />
+      <van-dropdown-item ref="itemRef4" title="负责人">
+        <van-cell-group inset>
+          <van-field v-model="param.xhzz_fzr" placeholder="请输入负责人" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onConfirm(3)">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+    </van-dropdown-menu>
+    <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+      <van-cell v-for="item in list" :key="item">
+        <template #title>
+          <span>{{ `${item.xhzz_cdmc}\u00A0\u00A0\u00A0 ${item.xhzz_cdbh}` }}</span>
+        </template>
+        <template #value>
+          <div>
+            <div>
+              <van-button class="w-60px" type="primary" size="small" @click="order(item)">预约</van-button>
+            </div>
+            <div style="margin-top: 10px;">
+              <img :src="getFullUrl(item.xhzz_tp)" @click="previewImg(getFullUrl(item.xhzz_tp))" />
+            </div>
+          </div>
+        </template>
+        <template #label>
+          <div><span>{{ `场地类别:${item.xhzl_flmc}` }}</span></div>
+          <div style="color: black;">
+            <div><span>{{ `占地面积:${item.xhzz_zdmj}\u00A0\u00A0\u00A0所属校区:${item.xhzz_ssxq}` }}</span></div>
+            <div><span>地址:{{ item.xhzz_dz }}</span></div>
+          </div>
+        </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
+}
+</style>

+ 56 - 0
src/pages/resourceOrder/orderManager/orderFrom/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>

+ 83 - 0
src/pages/resourceOrder/orderManager/orderFrom/index.vue

@@ -0,0 +1,83 @@
+<script setup>
+import { userInfo } from "~/store/user";
+import { showFailToast, showToast } from 'vant'
+import dateTimePicker from './dateTImePicker.vue'
+
+const { uo_type } = userInfo;
+const isBureau = ref(false); // 当前用户是否局端
+isBureau.value = uo_type === "1";
+
+const router = useRouter()
+
+let transParams = $ref({
+  xhzz_cdbh: '',
+  xhz_cdmc: '',
+  xhz_ssbm: '',
+  xhz_jyr: '',
+  xhz_pzr: '',
+  xhz_jysj_ks: '',
+  xhz_jysj_js: '',
+  xhz_yt: ''
+})
+const jysj_stratRef = $ref()
+const jysj_endRef = $ref()
+const onSubmit = () => {
+  transParams.xhz_jysj_ks = jysj_stratRef.getResult()
+  transParams.xhz_jysj_js = jysj_endRef.getResult()
+  request({ url: '/xdhq/hqgl_zyyy/add', data: { xdhq_hqgl_zyyy: transParams } }).then(res => {
+    if (res.code == '1') {
+      showToast('预约成功等待审核');
+      router.go(-1)
+    } else {
+      showFailToast(res.msg);
+    }
+  })
+};
+const cancel = () => {
+  router.go(-1)
+}
+
+const { currentRoute } = useRouter()
+request({
+  url: '/xdhq/hqgl_zyyyzy/detail',
+  data: {
+    xhzz_id: currentRoute.value.query.xhzz_id,
+  }
+}).then(res => {
+  if (res.code == 1) {
+    transParams.xhzz_cdbh = res.data.one_info.xhzz_cdbh
+    transParams.xhz_cdmc = res.data.one_info.xhzz_cdmc
+  }
+})
+</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>
+        <van-field v-model="transParams.xhzz_cdbh" readonly name="场地编号" label="场地编号" placeholder="请输入场地编号" />
+        <van-field v-model="transParams.xhz_cdmc" readonly name="场地名称" label="场地名称" placeholder="请输入场地名称" />
+        <van-field v-model="transParams.xhz_ssbm" name="所属部门" label="所属部门" placeholder="请输入所属部门"
+          :rules="[{ required: true, message: '请输入所属部门' }]" />
+        <van-field v-model="transParams.xhz_jyr" name="借用人" label="借用人" placeholder="请输入借用人"
+          :rules="[{ required: true, message: '请输入借用人' }]" />
+        <van-field v-model="transParams.xhz_pzr" name="批准人" label="批准人" placeholder="请输入批准人"
+          :rules="[{ required: true, message: '请输入批准人' }]" />
+        <dateTimePicker ref="jysj_stratRef" label="借用时间_开始" />
+        <dateTimePicker ref="jysj_endRef" label="借用时间_结束" />
+        <van-field v-model="transParams.xhz_yt" name="用途" label="用途" placeholder="请输入用途"
+          :rules="[{ required: true, message: '请输入用途' }]" />
+      </van-cell-group>
+      <div style="margin: 16px;">
+        <van-button round block type="primary" native-type="submit">
+          提交
+        </van-button>
+        <van-button style="margin-top: 10px;" round block type="default" @click="cancel()">
+          取消
+        </van-button>
+      </div>
+    </van-form>
+  </div>
+</template>

+ 9 - 3
src/pages/tdk/wdkb.vue

@@ -1,6 +1,12 @@
 <script setup lang='ts'>
 import { user } from '~/store/user'
 
+const team_id = await request({ url: '/jcxx/team/index', data: { team_current: '1' } }).then((res) => {
+  const { team_id, team_name } = res.data.page_data[0]
+  return team_id
+})
+console.log('team_id : ', team_id)
+
 const skzc = ref(1)
 
 const WeekMap = '一二三四五六日'
@@ -12,7 +18,7 @@ async function queryApi2() {
   tableData2.value = {}
   await request({
     url: '/xdjx/kbgl_jskbmx/index',
-    data: { limit: 100, xjj_xm: user.real_name, skzc: skzc.value },
+    data: { limit: 100, xjj_xm: user.real_name, skzc: skzc.value, team_id },
   }).then((res) => {
     const d = res.data.page_data
     // tableData2.value = (Array.from({ length: 8 }).map((_, i) => Array.from({ length: 7 }).map((_, j) => (null))))
@@ -48,7 +54,7 @@ function onConfirm({ selectedOptions }) {
 
 <template>
   <div class="px-2px mb-32px">
-    <van-field v-model="fieldValue" is-link readonly label="周次" placeholder="选择城市" @click="showPicker = true" />
+    <van-field v-model="fieldValue" is-link readonly label="周次" placeholder="选择周次" @click="showPicker = true" />
   </div>
 
   <van-popup v-model:show="showPicker" round position="bottom">
@@ -65,7 +71,7 @@ function onConfirm({ selectedOptions }) {
       </div>
     </div>
 
-    <div v-loading="loading_table2" class="tbody">
+    <div 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">

+ 108 - 0
src/pages/tdk/wdtdk.vue

@@ -0,0 +1,108 @@
+<script setup lang='ts'>
+const fieldValue = ref()
+const WeekMap = '一二三四五六日'
+
+const team_id = await request({ url: '/jcxx/team/index', data: { team_current: '1' } }).then((res) => {
+  const { team_id, team_name } = res.data.page_data[0]
+  fieldValue.value = team_name
+  return team_id
+})
+
+const form_team_id = ref(team_id)
+
+const columns = await request({ url: '/jcxx/team/index', data: { limit: 100 } }).then((res) => {
+  const d = res.data.page_data
+  return d.map((el: any) => ({ text: el.team_name, value: el.team_id }))
+})
+
+const showPicker = ref(false)
+
+function onConfirm({ selectedOptions }) {
+  showPicker.value = false
+  fieldValue.value = selectedOptions[0].text
+  form_team_id.value = selectedOptions[0].value
+
+  // queryApi2()
+}
+</script>
+
+<template>
+  <div class="px-2px">
+    <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 class="flex_center py-4">
+    <van-loading />
+  </div> -->
+
+  <remote-list
+    url="/xdjx/tdkgl_wdtdk/index" :d="{
+      team_id: form_team_id,
+    }" class="text-16px space-x-2 p-4px"
+    k="team_id"
+  >
+    <template
+      #default="{ row: { xtw_tklx, xtw_shzt, xtw_tklx_option_k, xtw_jsxm, xtw_tkzc, xtw_zcsj, xtw_tkjc, xtw_tkxq, xtw_tkmc, xtw_hdkjsxm, xtw_hdkzc, xtw_hdkzcsj, xtw_hdkjc, xtw_hdkxq, xtw_hdkmc } }"
+    >
+      <div class="px-18px py-12px bg-white rounded text-12px mb-8px">
+        <div class="flex justify-between mb-10px">
+          <div class="text-14px font-bold">
+            {{ xtw_tklx }}申请
+          </div>
+          <van-tag type="primary">
+            {{ xtw_shzt === '3' ? '待审核' : xtw_shzt }}
+          </van-tag>
+        </div>
+        <div class="flex justify-between px-4px">
+          <div class="w-4/9">
+            <div class="mb-4px font-bold">
+              调课前:
+            </div>
+            <template v-if="xtw_tklx_option_k === '1'">
+              <div>{{ xtw_jsxm }}/第{{ xtw_tkzc }}周 周{{ WeekMap[xtw_tkxq] }} 第{{ xtw_tkjc }}节/{{ xtw_tkmc }}</div>
+            </template>
+            <template v-else>
+              <div class="mb-2px">
+                {{ xtw_jsxm }}/第{{ xtw_tkzc }}周 周{{ WeekMap[xtw_tkxq ] }} 第{{ xtw_tkjc }}节/{{ xtw_tkmc }}
+              </div>
+              <div>
+                {{ xtw_hdkjsxm }}/第{{ xtw_hdkzc }}周 周{{ WeekMap[xtw_hdkxq] }} 第{{ xtw_hdkjc }}节/{{
+                  xtw_hdkmc
+                }}
+              </div>
+            </template>
+          </div>
+          <div class="w-4/9">
+            <div class="mb-4px font-bold">
+              调课后:
+            </div>
+            <template v-if="xtw_tklx_option_k === '1'">
+              <div>{{ xtw_hdkjsxm }}/第{{ xtw_tkzc }}周 周{{ WeekMap[xtw_tkxq] }} 第{{ xtw_tkjc }}节/{{ xtw_tkmc }}</div>
+            </template>
+            <template v-else>
+              <div class="mb-2px">
+                {{ xtw_hdkjsxm }}/第{{ xtw_tkzc }}周 周{{ WeekMap[xtw_tkxq] }} 第{{ xtw_tkjc }}节/{{ xtw_hdkmc }}
+              </div>
+              <div>
+                {{ xtw_jsxm }}/第{{ xtw_hdkzc }}周 周{{ WeekMap[xtw_hdkxq] }} 第{{ xtw_hdkjc }}节/{{
+                  xtw_tkmc
+                }}
+              </div>
+            </template>
+          </div>
+        </div>
+      </div>
+    </template>
+  </remote-list>
+</template>
+
+<style lang="scss" scoped>
+.flex_center {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+</style>

+ 264 - 0
src/pages/wuYuAppraise/studentQR/index.vue

@@ -0,0 +1,264 @@
+<script setup>
+import { showFailToast, showSuccessToast, showToast } from 'vant';
+import { userInfo } from '~/store/user'
+
+const { uo_type, uo_name, token } = userInfo
+
+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({
+  xdx_xsxh: '',
+  keyword: '',
+})
+let teamList = $ref([]);
+let team_id = $ref('')
+function onLoad() {
+  loading.value = true
+  request({
+    url: '/jcxx/team/index',
+    data: {
+      limit: 999,
+    }
+  }).then((res) => {
+    if (res.code == 1) {
+      teamList = res.data.page_data;
+      teamList.map((item) => {
+        if (item.team_current_option_k == "1") {
+          team_id = item.team_id;
+          request({
+            url: '/xddy/dygl_xsxjk/index',
+            data: {
+              page,
+              limit: 20,
+              ...param,
+              team_id,
+            },
+          }).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 itemRef = ref(null)
+function onConfirm() {
+  itemRef.value.toggle()
+  reGetList()
+}
+const itemXhRef = ref(null);
+function onXhConfirm() {
+  itemXhRef.value.toggle()
+  reGetList()
+}
+function reGetList() {
+  page = 1
+  list.value = []
+  finished.value = false
+  onLoad()
+}
+function handleLinkPf(item) {
+  let link = "http://60.188.226.44:8000/app/mobile/#/scanCode?xsxm=" +
+    item.xdx_xsxm +
+    "&xsxh=" +
+    item.xdx_xsxh +
+    "&sm_id=" +
+    item.sm_id +
+    "&token=" +
+    token +
+    "&xdx_id=" +
+    item.xdx_id;
+  window.open(link, '_self')
+}
+let showBottom = $ref(false);
+
+let pfList = $ref([]);
+let stuData = $ref({});
+let pfpage = 1;
+let pfLoading = $ref(false);
+let pffinished = $ref(false)
+function onPfLoad() {
+  pfLoading = true
+  return request({
+    url: "/xddy/dygl_wypj_pjjl/index",
+    data: {
+      wdwp_xs_xjh: stuData?.xdx_xsxh,
+      pfpage,
+      limit: 10,
+    },
+  }).then(res => {
+    const data = res.data
+    pfList = [...pfList, ...data.page_data]
+    pffinished = data.total_page === pfpage
+    pfpage++
+    pfLoading = false
+  })
+}
+// 查看评分
+function handleLookPf(item) {
+  showBottom = true;
+  stuData = item;
+  pfpage = 1
+  pfList = []
+  pffinished = false
+  onPfLoad();
+}
+function reGetPf() {
+  pfpage = 1
+  pfList = []
+  pffinished = false
+  onPfLoad();
+}
+
+// 编辑分数
+let wdwp_xs_df = $ref('');
+let editShow = $ref(false);
+let scoreData = $ref({});
+function handleEditPf(item) {
+  editShow = true;
+  scoreData = item;
+  wdwp_xs_df = item.wdwp_xs_df;
+}
+function editScoreSubmit() {
+  if (!wdwp_xs_df) {
+    return showFailToast('请输入分数')
+  }
+  let data = {
+    wdwp_id: scoreData.wdwp_id,
+    xddy_dygl_wypj_pjjl: {
+      wdwp_xs_df,
+    }
+  }
+  request({
+    url: "/xddy/dygl_wypj_pjjl/edit",
+    data,
+  }).then(res => {
+    if (res.code == '1') {
+      showSuccessToast('编辑成功');
+      editShow = false;
+      reGetPf();
+      reGetList();
+    } else {
+      showFailToast(res.msg)
+    }
+  })
+}
+</script>
+
+<template>
+  <div class="index">
+    <!-- <van-search v-model="param.keyword" :clearable="false" show-action placeholder="请输入搜索关键词" @search="onClickSearch">
+      <template #action>
+        <div @click="onClickSearch">
+          搜索
+        </div>
+      </template>
+    </van-search> -->
+    <van-dropdown-menu>
+      <van-dropdown-item ref="itemRef" title="学生姓名">
+        <van-cell-group inset>
+          <van-field clearable @clear="onConfirm" v-model="param.keyword" placeholder="请输入学生姓名" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onConfirm">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+      <van-dropdown-item ref="itemXhRef" title="学生学籍号">
+        <van-cell-group inset>
+          <van-field clearable @clear="onXhConfirm" v-model="param.xdx_xsxh" placeholder="请输入学生学籍号" />
+        </van-cell-group>
+        <div style="padding: 5px 16px;">
+          <van-button type="primary" block round @click="onXhConfirm">
+            确认
+          </van-button>
+        </div>
+      </van-dropdown-item>
+    </van-dropdown-menu>
+    <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
+      <van-cell v-for="item in list" :key="item">
+        <template #title>
+          <span>{{ `${item.xdx_xsxm}\u00A0\u00A0\u00A0 ${item.xdx_xsxh}` }}</span>
+        </template>
+        <!-- <template #value>
+          <span style="color:black">班级:{{ item.grade_name }}{{ item.class_name }}</span>
+        </template> -->
+        <template #label>
+          <div style="display: flex;justify-content: space-between;color: #666;">
+            <div><span>性别:{{ item.xdx_xb }}</span></div>
+            <div><span>积分:{{ item.xdx_jf }}</span></div>
+            <div> <span>班级:{{ item.grade_name }}{{ item.class_name }}</span></div>
+          </div>
+        </template>
+        <template #right-icon>
+          <span @click="handleLinkPf(item)" class="text-blue-500 mr-10px cursor-pointer">评分</span>
+          <span @click="handleLookPf(item)" class="text-blue-500 cursor-pointer">查看评分</span>
+        </template>
+      </van-cell>
+    </van-list>
+    <van-popup v-model:show="showBottom" position="bottom" :style="{ height: '80%' }" closeable round>
+      <van-list v-model:loading="pfLoading" :finished="pffinished" finished-text="没有更多了" @load="onPfLoad" class="mt-40px">
+        <van-cell v-for="item in pfList" :key="item">
+          <template #title>
+            <span>{{ `${item.wdwp_xs_xm}\u00A0\u00A0\u00A0 ${item.wdwp_xs_xjh}` }}</span>
+          </template>
+          <template #label>
+            <div style="display: flex;justify-content: space-between;color: #666;">
+              <div class="flex">
+                <span class="min-w-70px block">{{ item.xdww_name }}</span>
+                <span class="min-w-70px block">{{ item.xdwwp_name }} </span>
+                <span>得分: {{ item.wdwp_xs_df }}</span>
+              </div>
+            </div>
+            <div class="flex justify-between"><span>评分用户类型: {{ item.wdwp_pfyhlx }}</span> <span>评分用户姓名: {{
+              item.wdwp_pfyh_xm }}</span></div>
+          </template>
+          <template #right-icon>
+            <span @click="handleEditPf(item)" class="text-blue-500 mr-10px cursor-pointer">编辑分数</span>
+          </template>
+        </van-cell>
+      </van-list>
+    </van-popup>
+    <van-dialog v-model:show="editShow" title="编辑分数" show-cancel-button @confirm="editScoreSubmit">
+      <van-cell-group inset>
+        <van-field class="edit" v-model="wdwp_xs_df" type="number" label="得分" />
+      </van-cell-group>
+    </van-dialog>
+  </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(.edit) {
+  --van-dialog-background: #f2f2f2;
+
+  .van-cell__title {
+    width: unset !important;
+    justify-content: center !important;
+  }
+}
+</style>

+ 28 - 13
src/store/produ/la.js

@@ -7,16 +7,16 @@ export default {
   "user_role_id": "7",
   "user_level_id": "1",
   "user_detail_id": "0",
-  "user_score": "2",
+  "user_score": "134",
   "create_dateline": "1658113811",
-  "modify_dateline": "1681286358",
+  "modify_dateline": "1692696847",
   "isdelete": "0",
   "area_id1": "0",
   "area_id2": "0",
   "area_id3": "0",
   "area_id4": "0",
-  "dept_id": "1037",
-  "dept_id_all": "1037",
+  "dept_id": "333",
+  "dept_id_all": "333",
   "class_id": null,
   "user_phone": "",
   "user_cardno": "",
@@ -55,7 +55,8 @@ export default {
   "wx_last_token": null,
   "wx_last_login": null,
   "wx_graduation": "0",
-  "token": "8acfOcfYEQGEoGEb3Tti7FSyiHWU0G9Bc_aqye6XvHRiJjsiwLemLLvh9eDTujtxSYSkVG4jJ_ab52LY6XtFg_aVAuPZGadey7jD0vqIHl_ap26t",
+  "power_set": null,
+  "token": "f2c13s93wtxoJJ8lVACuzIcuCnZSYa909r8bxoz4FACGWgAUwT4bSejSiPJkPSCzzqXv8iNFasvHeFQLexjs6veDo70Vapy00YWN2EHJBvU",
   "setting": {
       "sitename": "景宁教育魔方",
       "sitedomain": "http://60.188.226.44:8090/",
@@ -73,18 +74,32 @@ export default {
           "uo_type": "1"
       },
       {
-          "uo_id": "1037",
-          "uo_name": "钉钉部署",
-          "uo_master_username": "6360ae01f70a665a9821efbe",
+          "uo_id": "1036",
+          "uo_name": "学校人员组织",
+          "uo_master_username": "",
           "uo_type": "1"
+      },
+      {
+          "uo_id": "1045",
+          "uo_name": "小学",
+          "uo_master_username": "",
+          "uo_type": "1"
+      },
+      {
+          "uo_id": "333",
+          "uo_name": "景宁畲族自治县红星小学",
+          "uo_master_username": "6360ae4ef70a665a9821efc3",
+          "uo_type": "2"
       }
   ],
-  "uo_id": "1037",
-  "uo_type": "1",
-  "uo_name": "钉钉部署",
+  "uo_id": "333",
+  "uo_type": "2",
+  "uo_name": "景宁畲族自治县红星小学",
   "dept_ids": [
       "323",
-      "1037"
+      "1036",
+      "1045",
+      "333"
   ],
   "dept_master": []
-}
+}

+ 8 - 8
src/store/user.js

@@ -1,6 +1,6 @@
 import { defineStore } from 'pinia'
 
-// import produ from './produ/lwj'
+// import produ from './produ/la'
 
 // localStorage.setItem(
 //   'userInfo',
@@ -28,7 +28,7 @@ export const userInfo = JSON.parse(localStorage.getItem('userInfo'))
 // } = userInfo
 
 export const user = {
-  userInfo: userInfo,
+  userInfo,
   token: userInfo?.token,
   // role: org_info.dept_role.role_id * 1,
   real_name: userInfo?.user_realname,
@@ -38,12 +38,12 @@ export const user = {
   //     RoleMap[k].includes(org_info.dept_role.role_id * 1)
   //   ) || 'None',
   power: userInfo?.power,
-  dept_ids:  userInfo?.dept_ids,
-  dept_id:  userInfo?.dept_id,
-  uo_id:  userInfo?.uo_id,
-  uo_name:  userInfo?.uo_name,
-  user_id:  userInfo?.user_id,
-  user_org:  userInfo?.user_org,
+  dept_ids: userInfo?.dept_ids,
+  dept_id: userInfo?.dept_id,
+  uo_id: userInfo?.uo_id,
+  uo_name: userInfo?.uo_name,
+  user_id: userInfo?.user_id,
+  user_org: userInfo?.user_org,
 }
 export const useUserStore = defineStore('user', {
   state: () => user,

+ 170 - 0
src/utils/request.js

@@ -0,0 +1,170 @@
+import axios from 'axios'
+import { showNotify  } from 'vant'
+
+import { userInfo } from '~/store/user'
+const { token } = userInfo
+
+const service = axios.create({
+  baseURL: window.globalVariables.api,
+  method: 'post',
+  timeout: 60000,
+  headers: {
+    'Content-Type': 'application/x-www-form-urlencoded',
+  },
+})
+
+service.interceptors.request.use(
+  (config) => {
+    // do something before request is sent
+
+    config.data = Object.assign(
+      {
+        token,
+        site: 'jnmf',
+        client: 'web',
+        api: 'json',
+        // from: 'backend',
+        issubmit: (config.url.endsWith('add') || config.url.endsWith('edit')) ? 1 : undefined
+      },
+      config.data || {}
+    )
+    if (config.method === 'get') {
+      config.params = Object.assign(
+        {
+          token,
+        },
+        config.params || {}
+      )
+    }
+    // 短时间多个请求会冲突
+    // console.groupCollapsed('axios: ' + config.url)
+    // console.log('request', config.data)
+    return config
+  },
+  (error) => {
+    // do something with request error
+    console.log(error) // for debug
+    return Promise.reject(error)
+  }
+)
+
+// response interceptor
+let isRelogin = false
+service.interceptors.response.use(
+  (response, c) => {
+    const { code, msg, data } = response.data
+    if (code === '10001') {
+      if (!isRelogin) {
+        isRelogin = true
+        showNotify({
+          type: 'warning',
+          message: msg
+        })
+        request({
+          url: '/user/main/login',
+          data: {
+            token: data.token
+          }
+        }).then(res => {
+          if (res.code == 1) {
+            localStorage.setItem('userInfo', JSON.stringify(res.data));
+            isRelogin = false
+            // 视情况打开
+            location.reload()
+          }
+        })
+      }
+
+    } else if (code != '1') {
+      // Message.error({ message: msg, dangerouslyUseHTMLString: true })
+      showNotify({
+        type: 'warning',
+        message: msg
+      })
+    }
+    // console.log('response', response.data)
+    // console.groupEnd()
+    return response.data
+  },
+  (error) => {
+    console.error('err' + error) // for debug
+    return Promise.reject(error)
+  }
+)
+
+// 上传
+export const request = axios.create({
+  baseURL: window.globalVariables.api,
+  method: 'post',
+  timeout: 5000,
+  headers: {
+    'Content-Type': 'application/x-www-form-urlencoded',
+  },
+})
+request.interceptors.response.use(
+  (response) => {
+    const { code, msg } = response.data
+    if (code !== '1') {
+      showNotify({
+        type: 'warning',
+        message: msg
+      })
+    }
+    return response.data
+  },
+  (error) => {
+    console.log('err' + error) // for debug
+    return Promise.reject(error)
+  }
+)
+
+export function download(url, data, name) {
+  const params = Object.assign({ token, limit: 10000, page: 1, api: 'xls' }, data)
+  const paramsStr = Object.entries(params).map(([k, v]) => `${k}=${v}`).join('&')
+  const el = document.createElement('a')
+  const href = `${window.globalVariables.api}${url}?${paramsStr}`
+  el.setAttribute('href', href)
+  name && el.setAttribute('download', name)
+  el.click()
+}
+
+export function download2(url, data, name) {
+  const el = document.createElement('a')
+  // const href = `${window.globalVariables.api}/openapi/download.php?path=${url}&name=${name}`
+  const ext = url.split('.').pop()
+  const filename = name.endsWith(`.${ext}`) ? name : `${name}.${ext}`
+  const href = `${window.globalVariables.oss}/${url}/${filename}`
+  el.setAttribute('href', href)
+  name && el.setAttribute('download', name)
+  console.log('download2:', href)
+  el.click()
+}
+
+export function download3(url, data, name) {
+  const el = document.createElement('a')
+  const href = `${url}/${name}`
+  el.setAttribute('href', href)
+  name && el.setAttribute('download', name)
+  el.click()
+}
+
+const obj2form = (data) => {
+  const formData = new FormData()
+  Object.keys(data).forEach(key => formData.append(key, data[key]))
+  return formData;
+}
+export default (...args) => {
+  console.log('args :>> ', args);
+  if (!isRelogin) {
+    const c = args[0]
+    if (c.$type === 'import')
+      return service(Object.assign({ ...c }, {
+        timeout: 10 * 60 * 1000,
+        transformRequest: [obj2form],
+      }))
+    return service(...args)
+  }
+  else
+    return Promise.reject({})
+}
+