Explorar el Código

Merge remote-tracking branch 'origin/250217外协发出一键选择工序,报工维护修改,分选包装后自动周转' into 250217外协发出一键选择工序,报工维护修改,分选包装后自动周转

guoyujia hace 4 meses
padre
commit
8a02f04679

+ 4 - 1
.env.development

@@ -23,4 +23,7 @@ VITE_HOST_URL = 'http://120.46.159.163:401'
 
 VITE_HOST_INNET = 'http://localhost:81'
 
-VITE_HOST_OUTNET = 'http://localhost:81'
+VITE_HOST_OUTNET = 'http://localhost:81'
+
+#站内信地址
+VITE_WS_API = '/ws'

+ 4 - 1
.env.production

@@ -26,4 +26,7 @@ VITE_HOST_IP = '192.168.10.40'
 
 VITE_HOST_INNET = 'http://192.168.10.41=2:82/onlinePreview?url='
 
-VITE_HOST_OUTNET = 'http://120.46.159.163:8012/onlinePreview?url='
+VITE_HOST_OUTNET = 'http://120.46.159.163:8012/onlinePreview?url='
+
+#站内信地址
+VITE_WS_API = '/ws'

+ 24 - 0
nginx.conf

@@ -13,6 +13,10 @@ http {
     keepalive_timeout  65;
     client_max_body_size 50m;
 
+    # upstream websocket_backend {
+    #     server websocket_server_address:port;  # 替换为你的 WebSocket 服务器地址和端口
+    # }
+
     server { 
 	listen 88;
 	server_name 120.46.159.163;
@@ -58,6 +62,26 @@ http {
 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 	proxy_pass http://120.46.159.163:7004/;
     }
+    location /ws/{
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "Upgrade";
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+        proxy_pass http://120.46.159.163:7001/ws/;
+    }
+    location /ws-production/ {
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "Upgrade";
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
+        proxy_pass http://120.46.159.163:7003/wsExport/;
+    }
 
         error_page   500 502 503 504  /50x.html;
         location = /50x.html {

+ 2 - 1
package.json

@@ -39,7 +39,8 @@
     "vue": "3.2.45",
     "vue-cropper": "1.0.3",
     "vue-router": "4.1.4",
-    "vxe-table": "^4.7.59"
+    "vxe-table": "^4.7.59",
+    "ws": "^8.18.0"
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "3.1.0",

+ 45 - 0
src/api/business/message.js

@@ -0,0 +1,45 @@
+import request from '@/utils/request'
+
+const baseUrl = import.meta.env.VITE_APP_BASE_API
+// 查询项目成员列表
+export function listMessage(query) {
+  return request({
+    url: baseUrl + '/business/message/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询项目成员详细
+export function getMessage(id) {
+  return request({
+    url: baseUrl + '/business/message/' + id,
+    method: 'get'
+  })
+}
+
+// 新增项目成员
+export function addMessage(data) {
+  return request({
+    url: baseUrl + '/business/message',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改项目成员
+export function updateMessage(data) {
+  return request({
+    url: baseUrl + '/business/message',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除项目成员
+export function delMessage(id) {
+  return request({
+    url: baseUrl + '/business/message/' + id,
+    method: 'delete'
+  })
+}

+ 5 - 1
src/components/Pagination/index.vue

@@ -2,7 +2,7 @@
   <div :class="{ 'hidden': hidden }" class="pagination-container">
     <el-pagination :background="background" v-model:current-page="currentPage" v-model:page-size="pageSize"
       :layout="layout" :page-sizes="pageSizes" :pager-count="pagerCount" :total="total" @size-change="handleSizeChange"
-      @current-change="handleCurrentChange" />
+      @current-change="handleCurrentChange" :size="size" />
   </div>
 </template>
 
@@ -48,6 +48,10 @@ const props = defineProps({
   hidden: {
     type: Boolean,
     default: false
+  },
+  size: {
+    type: String,
+    default: 'default'
   }
 })
 

+ 155 - 8
src/layout/components/Navbar.vue

@@ -1,17 +1,18 @@
 <template>
   <div class="navbar">
-    <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
+    <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container"
+      @toggleClick="toggleSideBar" />
     <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!settingsStore.topNav" />
     <top-nav id="topmenu-container" class="topmenu-container" v-if="settingsStore.topNav" />
 
     <div class="right-menu">
       <div style="color: #fff; padding-right: 16px; font-size: 14px">
         <span>当前厂别:</span>
-        <template v-if="currentTenantName!='超级管理员'">
-             <span style="cursor: pointer"  @click="handleShowTenantDialog">{{ currentTenantName }}</span>
+        <template v-if="currentTenantName != '超级管理员'">
+          <span style="cursor: pointer" @click="handleShowTenantDialog">{{ currentTenantName }}</span>
         </template>
         <template v-else>
-          <span style="cursor: pointer"  >{{ currentTenantName }}</span>
+          <span style="cursor: pointer">{{ currentTenantName }}</span>
         </template>
         <!-- <span style="cursor: pointer"  @click="handleShowTenantDialog">{{ currentTenantName }}</span> -->
       </div>
@@ -44,6 +45,14 @@
               <el-dropdown-item command="setLayout">
                 <span>布局设置</span>
               </el-dropdown-item>
+              <el-dropdown-item command="message" v-if="settingsStore.showMessage">
+                <el-badge :value="messageCount" :max="99" class="item" :hidden="messageCount == 0">
+                  <span>站内信</span>
+                </el-badge>
+              </el-dropdown-item>
+              <el-dropdown-item command="sendMessage" v-if="settingsStore.showMessage">
+                <span>发站内信</span>
+              </el-dropdown-item>
               <el-dropdown-item divided command="logout">
                 <span>退出登录</span>
               </el-dropdown-item>
@@ -58,11 +67,63 @@
         <el-table-column label="厂别" prop="orgName" header-align="center" />
         <el-table-column label="选择" prop="createTime" width="50" align="center">
           <template #default="scope">
-            <el-button link type="success" icon="Check" size="small"  @click="handleChangeTenant(scope.row)" >选择</el-button>
+            <el-button link type="success" icon="Check" size="small"
+              @click="handleChangeTenant(scope.row)">选择</el-button>
           </template>
         </el-table-column>
       </el-table>
     </el-dialog>
+    <el-dialog title="站内信" v-model="showMessageDialog" width="450" center @close="showMessageDialog = false">
+      <div class="page-container column-container">
+        <el-table ref="dialogTable" :data="messageList" height="460px" row-key="id" align="center">
+          <el-table-column label="行号" type="index" width="50" align="center" />
+          <el-table-column label="消息来源" prop="fromNickName" align="center" />
+          <el-table-column label="消息内容" prop="message" align="center" show-overflow-tooltip />
+          <el-table-column label="查看" width="120" align="center">
+            <template #default="scope">
+              <el-button type="success" icon="view" circle @click="handleView(scope.row)" />
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+          v-model:limit="queryParams.pageSize" @pagination="getMessages" size="small"
+          layout="total, prev, next, jumper" />
+      </div>
+    </el-dialog>
+    <el-dialog title="发消息" v-model="addMessageDialog" width="450" center @close="closeMessageFormDialog">
+      <el-form ref="addMessageFormRef" v-model="messageData" label-width="100">
+        <el-row :gutter="10">
+          <el-col :span="24">
+            <el-form-item label="收件人">
+              <el-autocomplete :fetch-suggestions="querySearchAsync" :trigger-on-focus="true" style="width: 100%"
+                v-model="messageData.toNickName" placeholder="选择人员" popper-class="my-autocomplete"
+                @select="handleSelectEmployee">
+                <template #default="{ item }">
+                  <div style="
+                      display: flex;
+                      flex-direction: row;
+                      justify-content: space-between;
+                    ">
+                    <div class="name" style="font-size: 12px">
+                      {{ item.nickName }}
+                    </div>
+                    <span class="code" style="font-size: 10px; color: darkgrey">{{ item.userName }}</span>
+                  </div>
+                </template>
+              </el-autocomplete>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="发送信息">
+              <el-input type="textarea" v-model="messageData.message"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <el-button @click="sendMessage">发送</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -72,6 +133,7 @@ import Breadcrumb from '@/components/Breadcrumb'
 import TopNav from '@/components/TopNav'
 import Hamburger from '@/components/Hamburger'
 import Screenfull from '@/components/Screenfull'
+import { selectUserList, getInfo } from "@/api/business/noCurrentReject";
 // import SizeSelect from '@/components/SizeSelect'
 // import HeaderSearch from '@/components/HeaderSearch'
 // import RuoYiGit from '@/components/RuoYi/Git'
@@ -81,17 +143,35 @@ import useUserStore from '@/store/modules/user'
 import useSettingsStore from '@/store/modules/settings'
 import { setTenant, getTenant } from '@/utils/auth'
 import { listTenant } from '@/api/business/tenant.js'
+import { listMessage } from '@/api/business/message.js'
 import router from '@/router'
+import useMessageStore from '@/store/modules/message'
+import { nextTick, onBeforeUnmount, onMounted } from 'vue'
 
 const { proxy } = getCurrentInstance()
 const appStore = useAppStore()
 const userStore = useUserStore()
 const settingsStore = useSettingsStore()
-
+const messageCount = ref(0)
+const showMessageDialog = ref(false)
 const tenantLoading = ref(false)
 const showDialog = ref(false)
+const addMessageDialog = ref(false)
 const tenantList = ref([])
+const messageList = ref([])
+const messageData = ref({
+  fromUserId: useUserStore().user.userId,
+  toUserId: null,
+  toUserName: null,
+  toNickName: null,
+  message: null
+})
 const currentTenantName = ref(getTenant().tenantName)
+const total = ref(0)
+const queryParams = ref({
+  pageSize: 10,
+  pageNum: 1
+})
 
 function toggleSideBar() {
   appStore.toggleSideBar()
@@ -105,6 +185,13 @@ function handleCommand(command) {
     case 'logout':
       logout()
       break
+    case 'message':
+      showMessageDialog.value = true
+      getMessages()
+      break
+    case 'sendMessage':
+      addMessageDialog.value = true
+      break
     default:
       break
   }
@@ -122,7 +209,7 @@ function logout() {
         location.href = '/index'
       })
     })
-    .catch(() => {})
+    .catch(() => { })
 }
 
 const emits = defineEmits(['setLayout'])
@@ -154,7 +241,7 @@ const handleChangeTenant = (row) => {
       })
       location.reload()
     })
-    .catch(() => {})
+    .catch(() => { })
 }
 
 const loadTenant = () => {
@@ -166,6 +253,66 @@ const loadTenant = () => {
     tenantLoading.value = false
   })
 }
+
+const messageCountChanged = (count) => {
+
+}
+const getMessages = () => {
+  console.log(userStore)
+  queryParams.value.toUserId = useUserStore().user.userId
+  listMessage(queryParams.value).then(res => {
+    if (res.code === 200) {
+      messageList.value = res.rows
+      total.value = res.total
+    } else {
+      messageList.value = []
+      total.value = 0
+    }
+
+  })
+}
+
+const closeMessageFormDialog = () => {
+  addMessageDialog.value = false
+  messageData.value = {
+    fromUserId: useUserStore().user.userId,
+    toUserId: null,
+    toUserName: null,
+    toNickName: null,
+    message: null
+  }
+}
+function querySearchAsync(queryString, cb) {
+  if (queryString) {
+    selectUserList(queryString).then((res) => {
+      cb(res.rows);
+    });
+  }
+}
+
+function handleSelectEmployee(item) {
+  messageData.value.toNickName = item.nickName;
+  messageData.value.toUserId = item.userId;
+  messageData.value.toUserName = item.userName;
+}
+
+function sendMessage() {
+  useMessageStore().sendMsg(messageData.value)
+  closeMessageFormDialog()
+}
+
+onMounted(() => {
+  window.addEventListener('messageChange', (target) => {
+    const count = target.detail
+    if (count != messageCount.value) {
+      messageCount.value = count
+    }
+    // console.log(messageCount)
+  })
+})
+onBeforeUnmount(() => {
+  window.removeEventListener('messageChange')
+})
 </script>
 
 <style lang="scss" scoped>

+ 8 - 0
src/permission.js

@@ -8,6 +8,7 @@ import { isRelogin } from '@/utils/request'
 import useUserStore from '@/store/modules/user'
 import useSettingsStore from '@/store/modules/settings'
 import usePermissionStore from '@/store/modules/permission'
+import useMessageStore from './store/modules/message'
 
 NProgress.configure({ showSpinner: false });
 
@@ -18,6 +19,8 @@ router.beforeEach((to, from, next) => {
   if (getToken()) {
     to.meta.title && useSettingsStore().setTitle(to.meta.title)
     useSettingsStore().initGenLotBySub()
+    useSettingsStore().initShowMessage()
+    useSettingsStore().initShowNotification()
     /* has token*/
     if (to.path === '/login') {
       next({ path: '/' })
@@ -37,6 +40,11 @@ router.beforeEach((to, from, next) => {
             })
             next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
           })
+          // console.log(useUserStore().user.userId)
+          if (useSettingsStore().showMessage) {
+            useMessageStore().connection(useUserStore().user.userId, getToken())
+            useMessageStore().initWebsocket()
+          }
         }).catch(err => {
           useUserStore().logOut().then(() => {
             ElMessage.error(err)

+ 2 - 2
src/plugins/notification.js

@@ -7,11 +7,11 @@ document.body.appendChild(div)
 
 export default (data) => {
   // console.log(data)
-  const { title, content } = data
+  const { title, content, updateContent } = data
   // console.log(notification)
   console.log(div)
   // 创建虚拟 DOM
-  const VNode = createVNode(notification, { title, content })
+  const VNode = createVNode(notification, { title, content: updateContent })
   // console.log(VNode)
   // 通过 render 函数挂载到页面中
   render(VNode, div)

+ 124 - 0
src/store/modules/message.js

@@ -0,0 +1,124 @@
+// const webSocket = require('ws')
+const wsUrl = 'ws://localhost:8080/ws/'
+
+const useMessageStore = defineStore('message', {
+  status: () => ({
+    // 未读消息数量
+    messageNum: 0,
+    ws: null,
+    latestMessage: null,
+    heartTimeOut: 40000,
+    lockReconnect: false,
+    timerReconnect: undefined,
+    timerHeart: undefined,
+    timerServerHeart: undefined,
+    handClose: false,
+    messageCount: 0
+  }),
+  actions: {
+    getMessageNum(message) {
+      this.messageNum++
+      this.latestMessage = message
+      // console.log(this.messageNum)
+      // console.log(this.latestMessage)
+      this.messageCount = this.latestMessage.data
+      const value = this.messageCount != null ? Number(this.messageCount) : 0
+      this.broadcastMessage(value)
+    },
+    broadcastMessage(count) {
+      const event = new CustomEvent('messageChange', { detail: count });
+      window.dispatchEvent(event);
+    },
+    acceptWs: () => {
+    },
+    async createWebSocket(id, token) {
+      // console.log(id, wsUrl, token)
+      try {
+        this.ws = new WebSocket(wsUrl + id, [token])
+      } catch (e) {
+        // console.log(e)
+        this.reconnection()
+      }
+    },
+    async connection(id, token) {
+      // this.getMessageNum('1')
+      // console.log(id, wsUrl, token)
+      // console.log(window)
+      // if("webSocket" in window) {
+      await this.createWebSocket(id, token)
+      // } else {
+      //   console.log('浏览器不支持websocket')
+      // }
+    },
+    initWebsocket() {
+      this.ws.onopen = (e) => {
+        this.ws.send("open server")
+        console.log("链接成功")
+        this.heartCheck()
+      }
+      this.ws.onmessage = (message) => {
+        this.getMessageNum(message)
+        this.heartCheck()
+      }
+      this.ws.onerror = (e) => {
+        console.log('链接失败')
+        this.reconnection()
+      }
+      this.ws.onclose = (e) => {
+        console.log("关闭连接")
+        if (!this.handClose) {
+          this.reconnection()
+        }
+      }
+    },
+    clearTimer() {
+      this.timerReconnect && clearTimeout(this.timerReconnect)
+      this.timerHeart && clearTimeout(this.timerHeart)
+      this.timerServerHeart && clearTimeout(this.timerServerHeart)
+    },
+    reconnection() {
+      console.log("重新连接")
+      if (this.lockReconnect) {
+        return
+      }
+      this.lockReconnect = true
+      if (this.timerReconnect) {
+        this.clearTimer(timerReconnect)
+      }
+      //没连上会一直重连, 设置迟延,避免请求过多
+      this.timerReconnect = setTimeout(() => {
+        //setTimeout 到点了执行
+        this.connection()
+        this.lockReconnect = false
+      }, 5000);
+    },
+    heartCheck() {
+      console.log('心跳检测')
+      if (this.timerHeart) {
+        clearTimeout(this.timerHeart)
+      }
+      this.timerHeart = setTimeout(() => {
+        // console.log("ping")
+        this.ws.send("ping")
+        this.lockReconnect = false
+      }, this.heartTimeOut)
+    },
+    sendMsg(data) {
+      console.log("发送信息")
+      if (this.ws.readyState === WebSocket.OPEN) {
+        this.ws.send(JSON.stringify(data))
+      }
+    },
+    closeWs() {
+      console.log("关闭ws")
+      this.handClose = true
+      this.clearTimer()
+      this.ws.close()
+    },
+    initMessageCount() {
+
+    }
+  }
+})
+
+export default useMessageStore

+ 17 - 1
src/store/modules/settings.js

@@ -19,7 +19,9 @@ const useSettingsStore = defineStore(
       fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader,
       sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo,
       dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle,
-      genLotBySub: false
+      genLotBySub: false,
+      showMessage: false,
+      showNotification: false
     }),
     actions: {
       // 修改布局设置
@@ -39,6 +41,20 @@ const useSettingsStore = defineStore(
           // console.log(res)
           this.genLotBySub = res.msg == 'true'
         })
+      },
+      initShowMessage(config) {
+        getConfigKey('business.sys.message').then(res => {
+          // console.log(res)
+          this.showMessage = res.msg == 'true'
+          console.log('是否显示站内信', this.showMessage)
+        })
+      },
+      initShowNotification(config) {
+        getConfigKey('business.sys.showAffiche').then(res => {
+          // console.log(res)
+          this.showNotification = res.msg == 'true'
+          console.log('是否显示公告', this.showNotification)
+        })
       }
     }
   })

+ 38 - 18
src/utils/request.js

@@ -6,11 +6,25 @@ import { tansParams, blobValidate } from '@/utils/ruoyi'
 import cache from '@/plugins/cache'
 import { saveAs } from 'file-saver'
 import useUserStore from '@/store/modules/user'
+import useSettingsStore from '@/store/modules/settings'
 import Notification from '../plugins/notification'
 // import emitter from '../eventBus'
 // import { getCurrentInstance } from 'vue';
 // import { reject } from 'lodash-es'
 
+const beforeNotification = ['\/ezhizao-dms-sys\/getInfo', '\/ezhizao-dms-sys\/getRouters', '\/ezhizao-dms-sys\/system\/config\/configKey\/']
+const checkBeforeUrl = (url) => {
+  let checked = false
+  // console.log(url)
+  beforeNotification.forEach(t => {
+    let reg = new RegExp('^' + t)
+    // console.log(t, reg.test(url))
+    checked = checked || reg.test(url)
+  })
+  // console.log(checked)
+  return checked
+}
+
 let downloadLoadingInstance
 // 是否显示重新登录
 export let isRelogin = { show: false }
@@ -51,24 +65,30 @@ service.interceptors.request.use(
     let notifications = []
     // 当登录状态为已登录时才可以获取公告
     // console.log(config)
-    if (getToken() && !isToken && tenantInfo && config.url != '/ezhizao-dms-sys/getInfo' && config.url != '/ezhizao-dms-sys/getRouters') {
+    // console.log(checkBeforeUrl(config.url))
+    if (getToken() && !isToken && tenantInfo && !checkBeforeUrl(config.url)) {
       // 所有条件都具备的情况下需先请求公告
-      // let url = import.meta.env.VITE_APP_BASE_API + '/business/notification/getUnshowedNotification'
-      // const res = await axios({
-      //   url: url,
-      //   method: 'get',
-      //   headers: {
-      //     Authorization: 'Bearer ' + getToken(),
-      //     tenantId: getTenant().tenantId,
-      //     appKey: 'ezhizao-identity'
-      //   }
-      // })
-      // if (res.data.code == 200) {
-
-      // } else if (res.data.code == 202) {
-      //   notifications = res.data.data
-      //   requestable = false
-      // }
+      let url = import.meta.env.VITE_APP_BASE_API + '/business/notification/getUnshowedNotification'
+      const showNotification = useSettingsStore().showNotification
+      console.log('是否显示公告', showNotification)
+      if (showNotification) {
+        const res = await axios({
+          url: url,
+          method: 'get',
+          headers: {
+            Authorization: 'Bearer ' + getToken(),
+            tenantId: getTenant().tenantId,
+            appKey: 'ezhizao-identity'
+          }
+        })
+        if (res.data.code == 200) {
+        } else if (res.data.code == 202) {
+          notifications = res.data.data
+          requestable = false
+          // showDialog()
+        }
+      }
+      // 
     }
     // get请求映射params参数
     if (config.method === 'get' && config.params) {
@@ -168,7 +188,7 @@ service.interceptors.response.use(
       ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
     } else if (message.includes('SHOW NOTIFICATION')) {
       // showDialog(data)
-      // Notification(data[0])
+      Notification(data[0])
     } else {
       ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
     }

+ 62 - 53
src/views/business/furnaceInfo/furnaceDialog.vue

@@ -4,42 +4,49 @@
       <el-form ref="furnaceRef" v-loading="loading" class="master-container" :model="furnaceInfo" :rules="rules"
         label-width="80px">
         <el-form-item label="炉号" prop="furnaceNumber">
-          <el-select-v2 v-model="furnaceInfo.furnaceNumber" :options="furnaceList" placeholder="请选择炉号" style="width: 200px"
-            @change="handleFurnaceChange" />
+          <el-select-v2 v-model="furnaceInfo.furnaceNumber" :options="furnaceList" placeholder="请选择炉号"
+            style="width: 200px" @change="handleFurnaceChange">
+            <template #default="{ item }">
+              <span style="margin-right: 8px">{{ item.label }}</span>
+              <span style="color: var(--el-text-color-secondary); font-size: 13px">
+                {{ item.time }}
+              </span>
+            </template>
+          </el-select-v2>
         </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="计划单号" prop="productionPlanNo">
-          <span>{{ furnaceInfo.productionPlanNo? furnaceInfo.productionPlanNo:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.productionPlanNo ? furnaceInfo.productionPlanNo : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="序号" prop="lineNumber">
-          <span>{{ furnaceInfo.lineNumber? furnaceInfo.lineNumber:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.lineNumber ? furnaceInfo.lineNumber : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="厂家" prop="factory">
-          <span>{{ furnaceInfo.factory? furnaceInfo.factory:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.factory ? furnaceInfo.factory : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="牌号" prop="brandNumber">
-          <span>{{ furnaceInfo.brandNumber? furnaceInfo.brandNumber:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.brandNumber ? furnaceInfo.brandNumber : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="规格" prop="spec">
-          <span>{{ furnaceInfo.spec? furnaceInfo.spec:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.spec ? furnaceInfo.spec : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="形状" prop="shape">
-          <span>{{ furnaceInfo.shape? furnaceInfo.shape:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.shape ? furnaceInfo.shape : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="材料直径" prop="diameter">
-          <span>{{ furnaceInfo.diameter? furnaceInfo.diameter:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.diameter ? furnaceInfo.diameter : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="来料编码" prop="rawMaterialCode">
-          <span>{{ furnaceInfo.rawMaterialCode? furnaceInfo.rawMaterialCode:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.rawMaterialCode ? furnaceInfo.rawMaterialCode : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="来料日期" prop="incomingDate">
-          <span>{{ furnaceInfo.incomingDate? furnaceInfo.incomingDate:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.incomingDate ? furnaceInfo.incomingDate : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="材质1" prop="firstTechnicalRequirement">
-          <span>{{ furnaceInfo.firstTechnicalRequirement? furnaceInfo.firstTechnicalRequirement:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.firstTechnicalRequirement ? furnaceInfo.firstTechnicalRequirement : '-' }}</span>
+        </el-form-item>
         <el-form-item v-if="Object.keys(furnaceInfo).length > 0" label="材质2" prop="secondTechnicalRequirement">
-          <span>{{ furnaceInfo.secondTechnicalRequirement? furnaceInfo.secondTechnicalRequirement:'-' }}</span>
-        </el-form-item> 
+          <span>{{ furnaceInfo.secondTechnicalRequirement ? furnaceInfo.secondTechnicalRequirement : '-' }}</span>
+        </el-form-item>
       </el-form>
     </div>
     <template #footer>
@@ -50,13 +57,13 @@
 </template>
 <script setup>
 import { getFurnaceNoInfo } from "@/api/business/furnaceNoInfo.js";
-import {updateDayworkFurnace} from '@/api/business/daywork.js'
+import { updateDayworkFurnace } from '@/api/business/daywork.js'
 const { proxy } = getCurrentInstance();
 const loading = ref(false)
 const visible = ref(false);
 const furnaceInfoList = ref([])
 const furnaceList = ref([])
-const detailInfo= ref({})
+const detailInfo = ref({})
 const furnaceInfo = ref(null)
 const emit = defineEmits(["handleSaveSuccess"]);
 const data = reactive({
@@ -64,17 +71,17 @@ const data = reactive({
     furnaceNumber: [{ required: true, message: "炉号不能为空", trigger: "change" }],
   },
 });
-const {rules } = toRefs(data);
+const { rules } = toRefs(data);
 
 /***********************  方法区  ****************************/
 /** 打开抽屉 */
 function open(data) {
   reset();
   visible.value = true;
- detailInfo.value = data
- console.log(detailInfo.value)
- console.log(furnaceInfo.value)
- getFunaceList()
+  detailInfo.value = data
+  console.log(detailInfo.value)
+  console.log(furnaceInfo.value)
+  getFunaceList()
 }
 
 /** 取消按钮 */
@@ -83,16 +90,16 @@ function handleCancel() {
   reset();
 }
 //获取炉号
-function getFunaceList(){
+function getFunaceList() {
   loading.value = true;
   furnaceList.value = [];
-//   furnaceInfoList.value = [{furnaceNumber:"777",lineNumber:'2',incomingDate:'2024-06-05'},{furnaceNumber:"888",lineNumber:'3',incomingDate:'2024-06-07'}]
-//   furnaceList.value = furnaceInfoList.value.map(item => {
-//   return {
-//     label: item.furnaceNumber,
-//     value: `${item.furnaceNumber}%${item.incomingDate}` // 假设您希望value是furnaceNumber
-//   };
-// });
+  //   furnaceInfoList.value = [{furnaceNumber:"777",lineNumber:'2',incomingDate:'2024-06-05'},{furnaceNumber:"888",lineNumber:'3',incomingDate:'2024-06-07'}]
+  //   furnaceList.value = furnaceInfoList.value.map(item => {
+  //   return {
+  //     label: item.furnaceNumber,
+  //     value: `${item.furnaceNumber}%${item.incomingDate}` // 假设您希望value是furnaceNumber
+  //   };
+  // });
   getFurnaceNoInfo({
     productionPlanNo: detailInfo.value.productionPlanNo,
     lineNumber: detailInfo.value.lineNumber,
@@ -100,13 +107,15 @@ function getFunaceList(){
     if (res.code === 200 && res.data.length > 0) {
       for (let i = 0; i < res.data.length; i++) {
         furnaceInfoList.value = res.data
+        console.log(furnaceInfoList.value)
         furnaceList.value = furnaceInfoList.value.map(item => {
-        return {
-          label: item.furnaceNumber,
-          value: `${item.furnaceNumber}%${item.incomingDate}` // 假设您希望value是furnaceNumber
-        };
-      });
-						}
+          return {
+            label: item.furnaceNumber,
+            time: item.incomingDate,
+            value: `${item.furnaceNumber}%${item.incomingDate}` // 假设您希望value是furnaceNumber
+          };
+        });
+      }
     } else {
       furnaceInfoList.value = []
       furnaceList.value = [];
@@ -122,12 +131,12 @@ function reset() {
   proxy.resetForm("furnaceRef");
 }
 //切换炉号
-function handleFurnaceChange(){
+function handleFurnaceChange() {
   let parts = furnaceInfo.value.furnaceNumber.split('%');
-let furnaceNumber = parts[0];
-let incomingDate = parts[1];
-console.log(parts)
-   furnaceInfo.value = furnaceInfoList.value.filter(item => item.furnaceNumber == furnaceNumber && item.incomingDate == incomingDate)[0]
+  let furnaceNumber = parts[0];
+  let incomingDate = parts[1];
+  console.log(parts)
+  furnaceInfo.value = furnaceInfoList.value.filter(item => item.furnaceNumber == furnaceNumber && item.incomingDate == incomingDate)[0]
   console.log(furnaceInfo.value)
 }
 
@@ -135,8 +144,8 @@ console.log(parts)
 function handleSave() {
   proxy.$refs["furnaceRef"].validate((valid) => {
     if (valid) {
-      updateDayworkFurnace({dayworkIds:detailInfo.value.dayworkIds,furnaceNoInfo:furnaceInfo.value}).then(res=>{
-        if(res.code == 200){
+      updateDayworkFurnace({ dayworkIds: detailInfo.value.dayworkIds, furnaceNoInfo: furnaceInfo.value }).then(res => {
+        if (res.code == 200) {
           proxy.$message.success("修改成功");
           visible.value = false;
           emit("handleSaveSuccess");
@@ -144,7 +153,7 @@ function handleSave() {
       })
     }
   })
- 
+
 }
 
 

+ 64 - 228
src/views/business/inventoryCheck/index.vue

@@ -3,262 +3,103 @@
     <!-- 左侧区域 -->
     <section class="list-part-container" style="flex: 3">
       <!-- 搜索区 -->
-      <el-form
-        class="list-search-container"
-        :model="queryParams"
-        ref="queryRef"
-        :inline="true"
-        style="margin-right: 0px"
-      >
+      <el-form class="list-search-container" :model="queryParams" ref="queryRef" :inline="true"
+        style="margin-right: 0px">
         <el-form-item class="section-title" label="盘点" />
         <el-form-item label="创建时间:">
-          <el-date-picker
-            v-model="queryParams.createStartTime"
-            type="date"
-            value-format="YYYY-MM-DD"
-            :editable="false"
-            clearable
-            placeholder="请选择"
-            style="width: 130px"
-          />
+          <el-date-picker v-model="queryParams.createStartTime" type="date" value-format="YYYY-MM-DD" :editable="false"
+            clearable placeholder="请选择" style="width: 130px" />
           <span>到</span>
-          <el-date-picker
-            v-model="queryParams.createEndTime"
-            type="date"
-            value-format="YYYY-MM-DD"
-            :editable="false"
-            clearable
-            placeholder="请选择"
-            style="width: 130px"
-          />
+          <el-date-picker v-model="queryParams.createEndTime" type="date" value-format="YYYY-MM-DD" :editable="false"
+            clearable placeholder="请选择" style="width: 130px" />
         </el-form-item>
         <el-form-item label="开始时间:">
-          <el-date-picker
-            v-model="queryParams.startTimeStr"
-            type="date"
-            value-format="YYYY-MM-DD"
-            :editable="false"
-            clearable
-            placeholder="请选择"
-            style="width: 130px"
-          />
+          <el-date-picker v-model="queryParams.startTimeStr" type="date" value-format="YYYY-MM-DD" :editable="false"
+            clearable placeholder="请选择" style="width: 130px" />
           <span>到</span>
-          <el-date-picker
-            v-model="queryParams.startTimeEnd"
-            type="date"
-            value-format="YYYY-MM-DD"
-            :editable="false"
-            clearable
-            placeholder="请选择"
-            style="width: 130px"
-          />
+          <el-date-picker v-model="queryParams.startTimeEnd" type="date" value-format="YYYY-MM-DD" :editable="false"
+            clearable placeholder="请选择" style="width: 130px" />
         </el-form-item>
         <el-form-item label="结束时间:">
-          <el-date-picker
-            v-model="queryParams.endTimeStr"
-            type="date"
-            value-format="YYYY-MM-DD"
-            :editable="false"
-            clearable
-            placeholder="请选择"
-            style="width: 130px"
-          />
+          <el-date-picker v-model="queryParams.endTimeStr" type="date" value-format="YYYY-MM-DD" :editable="false"
+            clearable placeholder="请选择" style="width: 130px" />
           <span>到</span>
-          <el-date-picker
-            v-model="queryParams.endTimeEnd"
-            type="date"
-            value-format="YYYY-MM-DD"
-            :editable="false"
-            clearable
-            placeholder="请选择"
-            style="width: 130px"
-          />
+          <el-date-picker v-model="queryParams.endTimeEnd" type="date" value-format="YYYY-MM-DD" :editable="false"
+            clearable placeholder="请选择" style="width: 130px" />
         </el-form-item>
         <el-form-item label="状态:">
-          <el-select
-            v-model="queryParams.status"
-            clearable
-            placeholder="请选择盘点状态"
-            style="width: 145px"
-          >
-            <el-option
-              v-for="dict in take_stock_status"
-              :key="dict.value"
-              :label="dict.label"
-              :value="dict.value"
-            ></el-option>
+          <el-select v-model="queryParams.status" clearable placeholder="请选择盘点状态" style="width: 145px">
+            <el-option v-for="dict in take_stock_status" :key="dict.value" :label="dict.label"
+              :value="dict.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="备注:">
-          <el-input
-            placeholder="请输入备注"
-            v-model.trim="queryParams.remark"
-            @keydown.enter.prevent
-            clearable
-            style="width: 120px"
-          />
+          <el-input placeholder="请输入备注" v-model.trim="queryParams.remark" @keydown.enter.prevent clearable
+            style="width: 120px" />
         </el-form-item>
         <el-form-item style="margin-left: 0">
-          <el-button type="info" icon="Search" @click="handleQuery"
-            >搜索
+          <el-button type="info" icon="Search" @click="handleQuery">搜索
           </el-button>
-          <el-button
-            v-show="!hasAlreadyAddTakeStock && !hasAlreadyTakeStock"
-            v-hasPermi="['business:inventoryCheck:add']"
-            type="primary"
-            icon="Plus"
-            @click="handleAdd"
-            >新增</el-button
-          >
+          <el-button v-show="!hasAlreadyAddTakeStock && !hasAlreadyTakeStock"
+            v-hasPermi="['business:inventoryCheck:add']" type="primary" icon="Plus" @click="handleAdd">新增</el-button>
         </el-form-item>
       </el-form>
       <div class="el-table-container">
         <div class="el-table-inner-container">
-          <el-table
-            ref="takeStockPeriodTable"
-            :data="takeStockPeriodList"
-            v-loading="loading"
-            highlight-current-row
-            height="100%"
-          >
-            <el-table-column
-              type="index"
-              label="行号"
-              width="50"
-              align="center"
-            />
-            <el-table-column
-              label="创建时间"
-              prop="createTime"
-              width="200"
-              align="center"
-            />
-            <el-table-column
-              label="开始时间"
-              prop="startTime"
-              width="200"
-              align="center"
-            />
-            <el-table-column
-              label="结束时间"
-              prop="endTime"
-              width="200"
-              align="center"
-            />
-            <el-table-column
-              label="盘点年月"
-              prop="stockTime"
-              width="150"
-              align="center"
-            >
+          <el-table ref="takeStockPeriodTable" :data="takeStockPeriodList" v-loading="loading" highlight-current-row
+            height="100%">
+            <el-table-column type="index" label="行号" width="50" align="center" />
+            <el-table-column label="创建时间" prop="createTime" width="200" align="center" />
+            <el-table-column label="开始时间" prop="startTime" width="200" align="center" />
+            <el-table-column label="结束时间" prop="endTime" width="200" align="center" />
+            <el-table-column label="盘点年月" prop="stockTime" width="150" align="center">
               <template #default="scope">
-                <el-date-picker
-                  v-if="scope.row.selectDateStatus"
-                  v-model="scope.row.stockTime"
-                  type="month"
-                  value-format="YYYY-M"
-                  :editable="false"
-                  clearable
-                  placeholder="请选择"
-                  style="width: 130px"
-                />
+                <el-date-picker v-if="scope.row.selectDateStatus" v-model="scope.row.stockTime" type="month"
+                  value-format="YYYY-M" :editable="false" clearable placeholder="请选择" style="width: 130px" />
                 <div v-else>{{ scope.row.stockTime }}</div>
               </template>
             </el-table-column>
-            <el-table-column
-              label="盘点状态"
-              prop="status"
-              width="80"
-              align="center"
-            >
+            <el-table-column label="盘点状态" prop="status" width="80" align="center">
               <template #default="scope">
-                <dict-tag
-                  :options="take_stock_status"
-                  :value="scope.row.status"
-                />
+                <dict-tag :options="take_stock_status" :value="scope.row.status" />
               </template>
             </el-table-column>
             <el-table-column label="备注" prop="remark" align="center">
               <template #default="scope">
                 <div v-if="scope.row.editStatus">
-                  <el-input
-                    v-model.trim="scope.row.remark"
-                    placeholder="请输入备注"
-                  />
+                  <el-input v-model.trim="scope.row.remark" placeholder="请输入备注" />
                 </div>
                 <div v-else>{{ scope.row.remark }}</div>
               </template>
             </el-table-column>
             <el-table-column label="操作" align="center" width="300">
               <template #default="scope">
-                <el-button
-                  v-show="!scope.row.editStatus"
-                  v-hasPermi="['business:inventoryCheck:edit']"
-                  link
-                  type="warning"
-                  icon="Edit"
-                  @click="handleUpdate(scope.row)"
-                >
+                <el-button v-show="!scope.row.editStatus" v-hasPermi="['business:inventoryCheck:edit']" link
+                  type="warning" icon="Edit" @click="handleUpdate(scope.row)">
                   编辑
                 </el-button>
-                <el-button
-                  v-show="
-                    !scope.row.editStatus &&
-                    (scope.row.status == 1 || scope.row.status == 2)
-                  "
-                  v-hasPermi="['business:inventoryCheck:view']"
-                  link
-                  type="primary"
-                  icon="View"
-                  @click="handleView(scope.row)"
-                >
+                <el-button v-show="!scope.row.editStatus &&
+                  (scope.row.status == 1 || scope.row.status == 2)
+                  " v-hasPermi="['business:inventoryCheck:view']" link type="primary" icon="View"
+                  @click="handleView(scope.row)">
                   查看
                 </el-button>
-                <el-button
-                  v-show="!scope.row.editStatus && scope.row.status == 0"
-                  v-hasPermi="['business:inventoryCheck:start']"
-                  link
-                  type="success"
-                  icon="Open"
-                  @click="handleStartTakeStock(scope.row)"
-                >
+                <el-button v-show="!scope.row.editStatus && scope.row.status == 0"
+                  v-hasPermi="['business:inventoryCheck:start']" link type="success" icon="Open"
+                  @click="handleStartTakeStock(scope.row)">
                   开始盘点
                 </el-button>
-                <el-button
-                  v-show="!scope.row.editStatus && scope.row.status == 1"
-                  link
-                  v-hasPermi="['business:inventoryCheck:end']"
-                  type="danger"
-                  icon="TurnOff"
-                  @click="handleEndTakeStock(scope.row)"
-                >
+                <el-button v-show="!scope.row.editStatus && scope.row.status == 1" link
+                  v-hasPermi="['business:inventoryCheck:end']" type="danger" icon="TurnOff"
+                  @click="handleEndTakeStock(scope.row)">
                   结束盘点
                 </el-button>
-                <el-button
-                  link
-                  v-if="scope.row.editStatus"
-                  icon="Close"
-                  type="danger"
-                  @click="handleCancel(scope.row, scope.$index)"
-                  >取消</el-button
-                >
-                <el-button
-                  link
-                  icon="Check"
-                  v-if="scope.row.editStatus"
-                  :loading = !canSave
-                  type="success"
-                  @click="handleSave(scope.row)"
-                  >保存</el-button
-                >
-                <el-button
-                  v-if="scope.row.status == 2"
-                  v-hasPermi="['business:inventoryCheck:downLoad']"
-                  link
-                  type="primary"
-                  icon="Download"
-                  @click="handleExport(scope.row)"
-                  >导出
+                <el-button link v-if="scope.row.editStatus" icon="Close" type="danger"
+                  @click="handleCancel(scope.row, scope.$index)">取消</el-button>
+                <el-button link icon="Check" v-if="scope.row.editStatus" :loading=!canSave type="success"
+                  @click="handleSave(scope.row)">保存</el-button>
+                <el-button v-if="scope.row.status == 2" v-hasPermi="['business:inventoryCheck:downLoad']" link
+                  type="primary" icon="Download" @click="handleExport(scope.row)">导出
                 </el-button>
               </template>
             </el-table-column>
@@ -266,13 +107,8 @@
         </div>
       </div>
       <!-- 分页 -->
-      <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getTakeStockPeriodList"
-      />
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize" @pagination="getTakeStockPeriodList" />
     </section>
     <!-- 盘点详情 -->
     <inventory-check-form ref="inventoryCheckFormRef" />
@@ -326,8 +162,8 @@ function getTakeStockPeriodList() {
     hasAlreadyAddTakeStock.value = res.others.hasTakeStockStatus;
     total.value = res.total;
     canSave.value = true
+    loading.value = false;
   });
-  loading.value = false;
 }
 //新增
 function handleAdd() {
@@ -353,16 +189,16 @@ function handleSave(row) {
   row.stockYear = row.stockTime.substring(0, 4);
   row.stockMonth = row.stockTime.substring(5, 7);
   console.log(row);
-  if(canSave.value){
+  if (canSave.value) {
     canSave.value = false
-  addTakeStockPeriod(row).then((res) => {
-    canSave.value = false;
-    if (res.code === 200) {
-      getTakeStockPeriodList();
-    }
-   
-  });
-}
+    addTakeStockPeriod(row).then((res) => {
+      canSave.value = false;
+      if (res.code === 200) {
+        getTakeStockPeriodList();
+      }
+
+    });
+  }
 }
 function handleExport(data) {
   console.log(data);

+ 46 - 20
src/views/business/outsourceInspectionVerify/index.vue

@@ -3,12 +3,12 @@
   <div class="page-container column-container">
     <!-- 搜索区 -->
     <el-form class="list-search-container" :model="queryParams" ref="queryRef" :inline="true">
-      <el-form-item label="检查日期:" prop="startTime">
-        <!-- <el-input v-model="queryParams.startTime" placeholder="" style="width: 144px" clearable
-          @keyup.enter="handleQuery" /> -->
+      <!-- <el-form-item label="检查日期:" prop="startTime">
+        <el-input v-model="queryParams.startTime" placeholder="" style="width: 144px" clearable
+          @keyup.enter="handleQuery" />
         <el-date-picker v-model="queryParams.startTime" type="date" placeholder="选择日期" style="width: 144px" clearable
           @keyup.enter="handleQuery" value-format="YYYY-MM-DD" />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="外协商名称:" prop="supplierName">
         <el-input v-model="queryParams.supplierName" placeholder="请输入外协商名称" style="width: 144px" clearable
           @keyup.enter="handleQuery" />
@@ -18,12 +18,19 @@
           @keyup.enter="handleQuery" />
       </el-form-item>
       <el-form-item label="发出单号:" prop="outsourcedOrderDetailFormCode">
-        <el-input v-model.trim="queryParams.outsourcedOrderDetailFormCode" placeholder="请输入发出单号" style="width: 144px" clearable
-          @keyup.enter="handleQuery" />
+        <el-input v-model.trim="queryParams.outsourcedOrderDetailFormCode" placeholder="请输入发出单号" style="width: 144px"
+          clearable @keyup.enter="handleQuery" />
       </el-form-item>
       <el-form-item label="收回单号:" prop="returnReceiptDetailFormCode">
-        <el-input v-model.trim="queryParams.returnReceiptDetailFormCode" placeholder="请输入收回单号" style="width: 144px" clearable
-          @keyup.enter="handleQuery" />
+        <el-input v-model.trim="queryParams.returnReceiptDetailFormCode" placeholder="请输入收回单号" style="width: 144px"
+          clearable @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="检查日期:">
+        <el-date-picker v-model="queryParams.startTime" type="date" value-format="YYYY-MM-DD" :editable="false"
+          :clearable="false" placeholder="请选择开始时间" style="width: 130px" @change="handleDateChange" />
+        <span>到</span>
+        <el-date-picker v-model="queryParams.endTime" type="date" value-format="YYYY-MM-DD" :editable="false"
+          :clearable="false" placeholder="请选择结束时间" style="width: 130px" @change="handleDateChange" />
       </el-form-item>
       <el-form-item label="状态:" prop="auditStatus">
         <el-select v-model="queryParams.auditStatus" style="width: 144px" clearable placeholder="请选择">
@@ -34,8 +41,12 @@
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-        <el-button type="primary" icon="Check" :disabled="ids&& ids.length == 0" @click="handlePass">批量通过</el-button>
-        <el-button type="danger" icon="Close" :disabled="ids&& ids.length == 0" @click="handleFail">批量不通过</el-button>
+        <el-button type="primary" icon="Check" :disabled="ids && ids.length == 0" @click="handlePass">批量通过</el-button>
+        <el-button type="danger" icon="Close" :disabled="ids && ids.length == 0" @click="handleFail">批量不通过</el-button>
+        <el-button type="primary" @click="exportForYear">导出审核列表</el-button>
+        <el-button v-if="exportSuccess" type="warning" icon="Download">下载导出excel</el-button>
+        <el-progress v-if="doingExport" class="export-progress" :percentage="exportProgress" />
+        <el-button v-if="doingExport" type="danger">停止导出</el-button>
       </el-form-item>
     </el-form>
 
@@ -62,11 +73,11 @@
           <el-table-column label="外协日期" align="center" prop="outsourcedOrderDetail.formDate" width="120">
             <template #default="scope">
               {{
-      parseTime(
-        scope.row.outsourcedOrderDetail.formDate,
-        "{y}-{m}-{d}"
-      )
-    }}
+                parseTime(
+                  scope.row.outsourcedOrderDetail.formDate,
+                  "{y}-{m}-{d}"
+                )
+              }}
             </template>
           </el-table-column>
           <el-table-column label="发出单号" align="center" prop="outsourcedOrderDetail.formCode" width="120" />
@@ -141,8 +152,8 @@ const queryParams = ref({
   pageSize: 10,
   formCode: null,
   formDate: null,
-  startTime: null,
-  endTime: null,
+  endTime: proxy.moment().format("YYYY-MM-DD"),
+  startTime: proxy.moment().subtract(1, "month").format("YYYY-MM-DD"),
   supplierName: null,
   deliveryMethod: null,
   packagingMethod: null,
@@ -156,6 +167,7 @@ const queryParams = ref({
 /** 查询外协单主 带箱方式,是整单的。如果换新箱子,明细中,都需要更换箱子列表 */
 function getList() {
   loading.value = true;
+
   listCheckoutInspection(queryParams.value).then((response) => {
     orderList.value = response.rows;
     total.value = response.total;
@@ -176,10 +188,10 @@ function resetQuery() {
   handleQuery();
 }
 //批量通过
-function handlePass(){
+function handlePass() {
   checkMultiplyFurnace(selections.value).then((res) => {
     if (res.code === 200) {
-      if (res.data.length >=1) {
+      if (res.data.length >= 1) {
         proxy
           .$confirm("是否确认通过?", "提示", {
             confirmButtonText: "确定",
@@ -210,7 +222,7 @@ function handlePass(){
   });
 }
 //批量不通过
-function handleFail(){
+function handleFail() {
   checkMultiplyFurnace(selections.value).then((res) => {
     if (res.code === 200) {
       proxy
@@ -269,6 +281,10 @@ function handleConfirm(row) {
   });
 }
 
+function handleDateChange() {
+  console.log(queryParams.value.startTime);
+  console.log(queryParams.value.endTime);
+}
 function handleReject(row) {
   checkFurnace(row).then((res) => {
     if (res.code === 200) {
@@ -287,5 +303,15 @@ function handleReject(row) {
   });
 }
 
+function exportForYear(row) {
+
+}
+
 getList();
 </script>
+<style>
+.export-progress .el-progress-bar {
+  /* margin-bottom: 15px; */
+  width: 100px;
+}
+</style>

+ 9 - 1
src/views/business/returnTurnover/DialogReturnTurnover.vue

@@ -22,7 +22,7 @@
       </el-form>
     </div>
     <template #footer>
-      <el-button v-if="form.flag" type="primary" icon="Check" @click="handleSave">确 定</el-button>
+      <el-button v-if="form.flag" :loading="saveLoading" type="primary" icon="Check" @click="handleSave">确 定</el-button>
       <el-button v-if="form.flag" icon="Close" @click="handleCancel">取 消</el-button>
     </template>
     <dialog-process ref="dialogProcessRef" />
@@ -46,6 +46,7 @@ const deptList = ref([]);
 const loadingCarrier = ref(false);
 const visible = ref(false);
 const dialogProcessRef = ref(null)
+const saveLoading = ref(false)
 const data = reactive({
   form: {},
   rules: {
@@ -189,8 +190,10 @@ function reset() {
 
 /** 提交按钮 */
 function handleSave() {
+  saveLoading.value = true
   if (!form.value.flag) {
     visible.value = false;
+    saveLoading.value = false
   } else {
     proxy.$refs["returnTurnoverRef"].validate((valid) => {
       if (valid) {
@@ -199,6 +202,7 @@ function handleSave() {
         checkCarriers({ carriers: carrierCode }).then(res => {
           if (!res.data) {
             proxy.$modal.msgError('请不要选择外协箱进行周转')
+            saveLoading.value = false
             return
           } else {
             //如果没有重新选箱
@@ -230,9 +234,13 @@ function handleSave() {
               proxy.$modal.msgSuccess("修改成功");
               visible.value = false;
               emit("handleSaveSuccess");
+              saveLoading.value = false
             });
           }
         })
+      } else {
+
+        saveLoading.value = false
       }
     });
   }

+ 16 - 14
src/views/business/returnTurnover/DialogReturnTurnoverBatch.vue

@@ -8,19 +8,13 @@
           <el-button @click="showProcessList">工序列表</el-button>
         </el-form-item>
         <el-form-item label="下序是否包装:" prop="isSortPackaging" label-width="130px">
-        <el-switch
-          v-model="form.isSortPackaging"
-          active-text="是"
-          :active-value="1"
-          inactive-text="否"
-          :inactive-value="0"
-
-        />
-      </el-form-item>
+          <el-switch v-model="form.isSortPackaging" active-text="是" :active-value="1" inactive-text="否"
+            :inactive-value="0" />
+        </el-form-item>
       </el-form>
     </div>
     <template #footer>
-      <el-button v-if="form.flag" type="primary" icon="Check" @click="handleSave">确 定</el-button>
+      <el-button v-if="form.flag" :loading="saveLoading" type="primary" icon="Check" @click="handleSave">确 定</el-button>
       <el-button v-if="form.flag" icon="Close" @click="handleCancel">取 消</el-button>
     </template>
     <dialog-process ref="dialogProcessRef" />
@@ -43,6 +37,7 @@ const deptList = ref([]);
 const loadingCarrier = ref(false);
 const visible = ref(false);
 const dialogProcessRef = ref(null)
+const saveLoading = ref(false)
 const data = reactive({
   form: {},
   rules: {
@@ -68,7 +63,7 @@ function openBatch(batches) {
   visible.value = true;
   console.log(batches)
   form.value = proxy.deepClone(batches[0]);
- form.value.isSortPackaging ="0"
+  form.value.isSortPackaging = "0"
   console.log(form.value)
   if (form.value.productionDeptId == 0) {
     form.value.productionDeptId = null;
@@ -116,12 +111,12 @@ function getTurnoverDept(data) {
 }
 function handleDeptChange() {
   console.log(deptList.value)
-  let deptInfo = deptList.value.find(item =>item.value == form.value.productionDeptId)
+  let deptInfo = deptList.value.find(item => item.value == form.value.productionDeptId)
   console.log(deptInfo)
-  if(deptInfo.isSortPackaging == 1) {
+  if (deptInfo.isSortPackaging == 1) {
     form.value.isSortPackaging = 1
     console.log(form.value)
-  }else{
+  } else {
     form.value.isSortPackaging = 0
   }
 }
@@ -176,18 +171,25 @@ function reset() {
 
 /** 提交按钮 */
 function handleSave() {
+  console.log(saveLoading.value)
+  saveLoading.value = true
   console.log(form.value)
   if (!form.value.flag) {
     visible.value = false;
+    saveLoading.value = false
   } else {
     proxy.$refs["returnTurnoverRef"].validate((valid) => {
       if (valid) {
+        console.log(saveLoading.value)
         //如果没有重新选箱
         batchReceiptTurnover(form.value).then((response) => {
           proxy.$modal.msgSuccess("修改成功");
           visible.value = false;
           emit("handleSaveSuccess");
+          saveLoading.value = false
         });
+      } else {
+        saveLoading.value = false
       }
     });
   }

+ 8 - 0
src/views/business/specialDaywork/form.vue

@@ -119,6 +119,14 @@
                   :clearable="false" @change="handleMiddleInfoChange" v-if="!isEdit">
                   <el-option v-for="info in furnaceNumberInfoList" :key="info.index" :label="info.text"
                     :value="info.value">
+                    <span style="float: left">{{ info.text }}</span>
+                    <span style="
+                              float: right;
+                              color: var(--el-text-color-secondary);
+                              font-size: 13px;
+                            ">
+                      {{ info.value.incomingDate }}
+                    </span>
                   </el-option>
                 </el-select>
                 <span class="rightInfo" v-else>{{

+ 16 - 12
src/views/index.vue

@@ -13,8 +13,8 @@
           </div>
           <div class="number-label">{{ totalCompanies }} 人</div>
         </div> -->
-        <!-- <div class="notifications-header">公告</div>
-        <el-row :gutter="5">
+        <div v-if="showNotification" class="notifications-header">公告</div>
+        <el-row v-if="showNotification" :gutter="5">
           <el-col :span="8" v-for="item in notifications">
             <el-card style="width: 100%;margin-bottom: 5px;" shadow="always" @click="showNotifiaction(item)">
               <template #header>
@@ -23,16 +23,16 @@
                   </div>
                 </div>
               </template>
-<div style="height: 40px;overflow: clip;">
-  <div v-html="item.content" style="height: 100%;">
-  </div>
-</div>
-<div class="footer">
-  {{ item.createTime }}
-</div>
-</el-card>
-</el-col>
-</el-row> -->
+              <div style="height: 40px;overflow: clip;">
+                <div v-html="item.content" style="height: 100%;">
+                </div>
+              </div>
+              <div class="footer">
+                {{ item.createTime }}
+              </div>
+            </el-card>
+          </el-col>
+        </el-row>
 
         <!-- <el-row v-for="item in notifications" style="padding: 5px 10px;">
           {{ item.title }}
@@ -71,6 +71,7 @@
 import { parseTime } from '@/utils/tools.js'
 import { listNotification } from '@/api/business/notification'
 import notification from '@/views/dialog/notification'
+import useSettingsStore from '@/store/modules/settings'
 
 // import { index } from '@/api/business/production'
 
@@ -151,12 +152,15 @@ let currentMonth = ref('')
 let statisticDom, statistic
 const notifications = ref([])
 const notificationRef = ref(null)
+const showNotification = ref(false)
 
 onMounted(() => {
   currentMonth.value = parseTime(new Date(), '{y}-{m}')
   //statisticDom = document.getElementById('information-statistic')
   //statistic = echarts.init(statisticDom)
   //getCurrentMonthDayArr()
+  console.log(useSettingsStore().showNotification)
+  showNotification.value = useSettingsStore().showNotification
   getList()
 })