This commit is contained in:
oneao committed 2025-10-10 16:46:03 +08:00
1 parent 18a0a81c20
commit 5bc05923f2
28 files changed
+834 -237

No files matched your search

@@ -0,0 +1,17 @@
{
"Print Vue3 SFC": {
"scope": "vue",
"prefix": "v3",
"body": [
"<script lang=\"ts\" setup>",
"",
"</script>\n",
"<template>",
" <view class=\"\">$1</view>",
"</template>\n",
"<style lang=\"scss\" scoped>",
"",
"</style>\n"
]
}
}
@@ -17,5 +17,6 @@ export default antfu({
rules: { rules: {
'no-console': 'off', // 允许 console.log 不报错 'no-console': 'off', // 允许 console.log 不报错
"prefer-promise-reject-errors": "off"
}, },
}) })
@@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /> <link rel="shortcut icon" href="/public/logo.png" type="image/x-icon" />
<script> <script>
const coverSupport = const coverSupport =
'CSS' in window && 'CSS' in window &&
@@ -83,7 +83,7 @@
"dayjs": "^1.11.18", "dayjs": "^1.11.18",
"pinia": "^3.0.3", "pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0", "pinia-plugin-persistedstate": "^4.5.0",
"sard-uniapp": "^1.24.6", "sard-uniapp": "^1.24.7",
"vue": "^3.5.21", "vue": "^3.5.21",
"z-paging": "^2.8.8" "z-paging": "^2.8.8"
}, },
+5 -5
View File
@@ -69,8 +69,8 @@ importers:
specifier: ^4.5.0 specifier: ^4.5.0
version: 4.5.0(pinia@3.0.3(typescript@5.8.3)(vue@3.5.22(typescript@5.8.3))) version: 4.5.0(pinia@3.0.3(typescript@5.8.3)(vue@3.5.22(typescript@5.8.3)))
sard-uniapp: sard-uniapp:
specifier: ^1.24.6 specifier: ^1.24.7
version: 1.24.6(@dcloudio/types@3.4.21)(vue@3.5.22(typescript@5.8.3)) version: 1.24.7(@dcloudio/types@3.4.21)(vue@3.5.22(typescript@5.8.3))
vue: vue:
specifier: ^3.5.21 specifier: ^3.5.21
version: 3.5.22(typescript@5.8.3) version: 3.5.22(typescript@5.8.3)
@@ -4621,8 +4621,8 @@ packages:
safer-buffer@2.1.2: safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
sard-uniapp@1.24.6: sard-uniapp@1.24.7:
resolution: {integrity: sha512-T8TK4cPlVlcm7K57niQurRC6KdjkmjyE3a+RUoGnPR8t32Sim7F7kApATR4NewTZt6pGscuEaC/pcHx1cxvJoQ==} resolution: {integrity: sha512-QXk/zWH5j62VOUsaf8mSk0i8k/OMkUoSIqOTmxb7vpC+UpiJ5Uwypayb9HarlgStXpqIc3HmTOIG+2cNo+yFCA==}
engines: {HBuilderX: ^3.6.0, uni-app: ^4.11, uni-app-x: ''} engines: {HBuilderX: ^3.6.0, uni-app: ^4.11, uni-app-x: ''}
peerDependencies: peerDependencies:
'@dcloudio/types': ^3.4.8 '@dcloudio/types': ^3.4.8
@@ -11078,7 +11078,7 @@ snapshots:
safer-buffer@2.1.2: {} safer-buffer@2.1.2: {}
sard-uniapp@1.24.6(@dcloudio/types@3.4.21)(vue@3.5.22(typescript@5.8.3)): sard-uniapp@1.24.7(@dcloudio/types@3.4.21)(vue@3.5.22(typescript@5.8.3)):
dependencies: dependencies:
'@dcloudio/types': 3.4.21 '@dcloudio/types': 3.4.21
vue: 3.5.22(typescript@5.8.3) vue: 3.5.22(typescript@5.8.3)
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -19,7 +19,7 @@ onHide(() => {
<style> <style>
page { page {
background-color: #fcfbfe; background-color: #f7f7f8;
} }
</style> </style>
@@ -1,6 +1,6 @@
import { createSSRApp } from 'vue' import { createSSRApp } from 'vue'
import App from './App.vue' import App from './App.vue'
import { routeInterceptor } from './interceptor/router' import { routeInterceptor } from './router/interceptor'
import store from './store' import store from './store'
import '@/style/index.scss' import '@/style/index.scss'
@@ -1,5 +1,5 @@
{ {
"name": "BASE-UNIAPP", "name": "App",
"appid": "__UNI__871096C", "appid": "__UNI__871096C",
"description": "", "description": "",
"versionName": "1.0.0", "versionName": "1.0.0",
@@ -3,7 +3,6 @@ import type { UploadFile, UploadFileItem } from 'sard-uniapp'
import { isImageUrl, isVideoUrl, toast } from 'sard-uniapp' import { isImageUrl, isVideoUrl, toast } from 'sard-uniapp'
import { aliyunpluploadApi, delSubRecordApi, searchdataApi } from '@/request/api' import { aliyunpluploadApi, delSubRecordApi, searchdataApi } from '@/request/api'
import { downloadFile, formatFileSize, imageCompress, isImage, uploadFileToAliyun } from '@/utils/file' import { downloadFile, formatFileSize, imageCompress, isImage, uploadFileToAliyun } from '@/utils/file'
import { isH5 } from '@/utils/platform'
const fileList = ref<UploadFileItem[]>([]) const fileList = ref<UploadFileItem[]>([])
@@ -50,8 +49,9 @@ async function loadFileData() {
} }
function onItemClick(fileItem: UploadFileItem) { function onItemClick(fileItem: UploadFileItem) {
console.log(fileItem)
if (!isImageUrl(fileItem.mx_mapfilename) && !isVideoUrl(fileItem.mx_mapfilename)) { if (!isImageUrl(fileItem.mx_mapfilename) && !isVideoUrl(fileItem.mx_mapfilename)) {
downloadFile(fileItem.mx_mapfilename) downloadFile(fileItem.mx_mapfilename,fileItem.name)
} }
} }
@@ -94,58 +94,52 @@ function onSubmit() {
<view class="form-list"> <view class="form-list">
<sar-form-item-plain name="orgid"> <sar-form-item-plain name="orgid">
<template #custom="{ fieldId }"> <view class="form-label">
<view class="form-label" :class="fieldId"> <text>机构码</text>
<text>机构码</text> </view>
</view> <view class="form-input">
<view class="form-input"> <sar-input
<sar-input v-model="formModel.orgid"
v-model="formModel.orgid" placeholder="请输入机构码"
placeholder="请输入机构码" clearable
clearable >
> <template #prepend>
<template #prepend> <sar-icon family="iconfont" name="company" size="36rpx" />
<sar-icon family="iconfont" name="company" size="36rpx" /> </template>
</template> </sar-input>
</sar-input> </view>
</view>
</template>
</sar-form-item-plain> </sar-form-item-plain>
<sar-form-item-plain name="userid"> <sar-form-item-plain name="userid">
<template #custom="{ fieldId }"> <view class="form-label">
<view class="form-label" :class="fieldId"> 账号
账号 </view>
</view> <view class="form-input">
<view class="form-input"> <sar-input
<sar-input v-model="formModel.userid"
v-model="formModel.userid" placeholder="请输入账号"
placeholder="请输入账号" clearable
clearable >
> <template #prepend>
<template #prepend> <sar-icon family="iconfont" name="user" size="36rpx" />
<sar-icon family="iconfont" name="user" size="36rpx" /> </template>
</template> </sar-input>
</sar-input> </view>
</view>
</template>
</sar-form-item-plain> </sar-form-item-plain>
<sar-form-item-plain name="password"> <sar-form-item-plain name="password">
<template #custom="{ fieldId }"> <view class="form-label">
<view class="form-label" :class="fieldId"> 密码
密码 </view>
</view> <view class="form-input">
<view class="form-input"> <sar-input
<sar-input v-model="formModel.password"
v-model="formModel.password" placeholder="请输入密码"
placeholder="请输入密码" clearable
clearable >
> <template #prepend>
<template #prepend> <sar-icon family="iconfont" name="lock" size="36rpx" />
<sar-icon family="iconfont" name="lock" size="36rpx" /> </template>
</template> </sar-input>
</sar-input> </view>
</view>
</template>
</sar-form-item-plain> </sar-form-item-plain>
</view> </view>
@@ -1,9 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import { toast } from 'sard-uniapp' import { toast } from 'sard-uniapp'
import { ref } from 'vue' import { ref } from 'vue'
import { searchdatapageindexApi } from '@/request/api' import { saveobjtApi, searchdatapageindexApi } from '@/request/api'
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
import { useCounts } from '@/store/counts'
import { getCurrentDateTimeWithSeconds } from '@/utils/time'
const { taskCounts } = useCounts()
const userStore = useUserStore() const userStore = useUserStore()
const pagingRef = ref<any>(null) const pagingRef = ref<any>(null)
@@ -11,15 +14,30 @@ const dataList = ref<any[]>([])
// 自定义 tabs // 自定义 tabs
const tabList = computed(() => [ const tabList = computed(() => [
{ name: '未完成', count: 0 }, { name: '未完成', count: taskCounts.yx.todo },
{ name: '已完成', count: 0 }, { name: '已完成', count: taskCounts.yx.finished },
{ name: '全部', count: 0 }, { name: '全部', count: taskCounts.yx.total },
]) ])
const activeTab = ref(tabList.value[0]) const activeTab = ref(tabList.value[0])
// 搜索关键字 // 搜索关键字
const searchValue = ref('') const searchValue = ref('')
const confirmDialogVisible = ref(false)
const confirmFormRef = ref()
const confirmFormModel = ref<any>({})
const bconkzOptions = ref([
{
value: '空箱',
label: '空箱',
},
{
value: '重箱',
label: '重箱',
},
])
// 切换 tab // 切换 tab
function switchTab(tab: any) { function switchTab(tab: any) {
activeTab.value = tab activeTab.value = tab
@@ -38,19 +56,19 @@ function queryList(pageNo: number, pageSize: number) {
const userid = userStore.userInfo.userid const userid = userStore.userInfo.userid
let searchcondition = `2>1 AND b_kd_finish = '1' AND b_yx_finish = '1' ` let searchcondition = `2>1 AND b_kd_finish = '1' `
if (activeTab.value.name === '未完成') { if (activeTab.value.name === '未完成') {
searchcondition += ` AND ISNULL(b_dc_finish,'') <> '1' AND ISNULL(b_dcman_id,'') IN ('', '${userid}')` searchcondition += ` AND ISNULL(b_yx_finish,'') <> '1' AND ISNULL(b_yxman_id,'') IN ('', '${userid}')`
} }
else if (activeTab.value.name === '已完成') { else if (activeTab.value.name === '已完成') {
searchcondition += ` AND ISNULL(b_dc_finish,'') = '1' AND ISNULL(b_dcman_id,'') = '${userid}'` searchcondition += ` AND ISNULL(b_yx_finish,'') = '1' AND ISNULL(b_yxman_id,'') = '${userid}'`
} }
else { else {
searchcondition += ` AND ( searchcondition += ` AND (
(ISNULL(b_dc_finish,'') <> '1' AND ISNULL(b_dcman_id,'') IN ('', '${userid}')) (ISNULL(b_yx_finish,'') <> '1' AND ISNULL(b_yxman_id,'') IN ('', '${userid}'))
OR (ISNULL(b_dc_finish,'') = '1' AND ISNULL(b_dcman_id,'') = '${userid}') OR (ISNULL(b_yx_finish,'') = '1' AND ISNULL(b_yxman_id,'') = '${userid}')
)` )`
} }
if (searchValue.value) { if (searchValue.value) {
@@ -67,7 +85,14 @@ function queryList(pageNo: number, pageSize: number) {
}) })
.then((res) => { .then((res) => {
const rows = res.data.rows || [] const rows = res.data.rows || []
pagingRef.value.complete(rows)
if (rows) {
pagingRef.value.complete(rows)
}
if (activeTab.value.name === '未完成' && res.data.total) {
taskCounts.yx.todo = res.data.total
}
}) })
.finally(() => { .finally(() => {
toast.hide() toast.hide()
@@ -79,9 +104,190 @@ function handleToFile(itemData) {
url: `/pages-sub/file/index?moduleid=xc_conyard_in&father=${itemData.b_id}&cateid=014&edit=1`, url: `/pages-sub/file/index?moduleid=xc_conyard_in&father=${itemData.b_id}&cateid=014&edit=1`,
}) })
} }
function showConfirmDialog(itemData: any) {
confirmFormModel.value = JSON.parse(JSON.stringify(itemData))
confirmDialogVisible.value = true
}
async function handleConfirmDialogBeforeClose(type: string) {
if (type !== 'confirm') {
return
}
try {
await confirmFormRef.value?.validate()
}
catch {
return Promise.reject()
}
if (confirmFormModel.value.b_kd_finish !== '1') {
toast.fail('尚未开票,请先开票')
return Promise.reject()
}
if (confirmFormModel.value.b_yx_finish !== '1') {
toast.fail('请先验箱')
return Promise.reject()
}
const obj: any = {
b_id: confirmFormModel.value.b_id,
b_yx_finishdate: getCurrentDateTimeWithSeconds(),
b_yxman_id: userStore.userInfo.userid,
b_yx_finish: '1',
b_conno: confirmFormModel.value.b_conno,
b_conkz: confirmFormModel.value.b_conkz,
b_contype: confirmFormModel.value.b_contype,
b_constate: confirmFormModel.value.b_constate,
b_conxk: confirmFormModel.value.b_conxk,
}
const strmainvalue = `[${JSON.stringify(obj)}]`
const res = await saveobjtApi({
tables: '[xc_consite_in]',
insertValues: '[]',
delValues: '[]',
updateValues: strmainvalue,
keys: '[b_id]',
})
if (res?.data !== 'OK') {
toast.fail(`堆高机验证失败:${res.data}`)
return Promise.reject()
}
const idx = dataList.value.findIndex(i => i.b_id === confirmFormModel.value.b_id)
if (idx !== -1) {
if (activeTab.value.name === '未完成') {
dataList.value.splice(idx, 1)
}
else {
Object.assign(dataList.value[idx], obj)
}
}
if (taskCounts.yx.todo > 0) {
taskCounts.yx.todo -= 1
taskCounts.yx.total -= 1
}
toast.success('验箱成功')
}
function handleConfirmDialogAfterLeave() {
confirmFormModel.value = {}
}
</script> </script>
<template> <template>
<sar-dialog
v-model:visible="confirmDialogVisible"
popup-style="top: 50%"
title="验箱表单"
:confirm-props="{
size: 'small',
theme: 'success',
square: true,
}"
:cancel-props="{
size: 'small',
square: true,
}"
:before-close="handleConfirmDialogBeforeClose"
:after-leave="handleConfirmDialogAfterLeave"
>
<scroll-view
style="max-height: 60vh; margin-top: 1px; margin-bottom: 16rpx"
scroll-y
>
<sar-form ref="confirmFormRef" :model="confirmFormModel" label-width="150rpx" label-align="end">
<sar-form-item
name="b_conno"
label="箱号"
:rules="[{ required: true }]"
>
<sar-input
v-model="confirmFormModel.b_conno"
inlaid
/>
</sar-form-item>
<sar-form-item
name="b_id"
label="进场单号"
>
<sar-input
v-model="confirmFormModel.b_id"
inlaid
readonly
/>
</sar-form-item>
<sar-form-item
name="b_contype"
label="箱型"
>
<picker-select-input
v-model:label="confirmFormModel.b_contype"
v-model:value="confirmFormModel.b_contype"
viewname="b_con_type"
label-field="b_name"
value-field="b_name"
field1="b_name"
field2="b_id"
placeholder="请选择箱型"
/>
</sar-form-item>
<sar-form-item
name="b_conkz"
label="空箱重"
>
<sar-picker-input
v-model="confirmFormModel.b_conkz"
title="请选择空箱重"
placeholder="请选择空箱重"
clearable
:columns="bconkzOptions"
/>
</sar-form-item>
<sar-form-item
name="b_constate"
label="箱态"
>
<picker-select-input
v-model:label="confirmFormModel.b_constate"
v-model:value="confirmFormModel.b_constate"
viewname="b_constate"
label-field="b_name"
value-field="b_name"
field1="b_name"
field2="b_id"
placeholder="请选择箱态"
/>
</sar-form-item>
<sar-form-item
name="b_conxk"
label="箱况"
>
<picker-select-input
v-model:label="confirmFormModel.b_conxk"
v-model:value="confirmFormModel.b_conxk"
viewname="b_conxk"
label-field="b_name"
value-field="b_name"
field1="b_name"
field2="b_id"
placeholder="请选择箱况"
/>
</sar-form-item>
</sar-form>
</scroll-view>
</sar-dialog>
<view> <view>
<z-paging ref="pagingRef" v-model="dataList" @query="queryList"> <z-paging ref="pagingRef" v-model="dataList" @query="queryList">
<template #top> <template #top>
@@ -99,9 +305,13 @@ function handleToFile(itemData) {
:class="{ 'tabs__item--active': activeTab.name === tab.name }" :class="{ 'tabs__item--active': activeTab.name === tab.name }"
@click="switchTab(tab)" @click="switchTab(tab)"
> >
<sar-badge :value="tab.count"> <sar-badge v-if="tab.count > 0" :value="tab.count">
{{ tab.name }} {{ tab.name }}
</sar-badge> </sar-badge>
<text v-else>
{{ tab.name }}
</text>
</view> </view>
</view> </view>
</template> </template>
@@ -117,10 +327,10 @@ function handleToFile(itemData) {
箱号:{{ item.b_conno }} 箱号:{{ item.b_conno }}
</view> </view>
<view class="list-item__extra"> <view class="list-item__extra">
<sar-tag v-if="item.b_dc_finish === '1'" theme="success" size="small"> <sar-tag v-if="item.b_yx_finish === '1'" theme="success" size="small">
已完成 已完成
</sar-tag> </sar-tag>
<sar-tag v-else> <sar-tag v-else theme="secondary">
未完成 未完成
</sar-tag> </sar-tag>
</view> </view>
@@ -138,6 +348,8 @@ function handleToFile(itemData) {
</view> </view>
</view> </view>
</sar-col> </sar-col>
</sar-row>
<sar-row>
<sar-col :span="12"> <sar-col :span="12">
<view class="list-item__info"> <view class="list-item__info">
<view class="list-item__label"> <view class="list-item__label">
@@ -148,6 +360,8 @@ function handleToFile(itemData) {
</view> </view>
</view> </view>
</sar-col> </sar-col>
</sar-row>
<sar-row>
<sar-col :span="6"> <sar-col :span="6">
<view class="list-item__info"> <view class="list-item__info">
<view class="list-item__label"> <view class="list-item__label">
@@ -168,6 +382,8 @@ function handleToFile(itemData) {
</view> </view>
</view> </view>
</sar-col> </sar-col>
</sar-row>
<sar-row>
<sar-col :span="6"> <sar-col :span="6">
<view class="list-item__info"> <view class="list-item__info">
<view class="list-item__label"> <view class="list-item__label">
@@ -188,16 +404,6 @@ function handleToFile(itemData) {
</view> </view>
</view> </view>
</sar-col> </sar-col>
<sar-col :span="6">
<view class="list-item__info">
<view class="list-item__label">
箱位:
</view>
<view class="list-item__value">
{{ item.b_xwt }}
</view>
</view>
</sar-col>
</sar-row> </sar-row>
</view> </view>
@@ -206,12 +412,13 @@ function handleToFile(itemData) {
拍照 拍照
</sar-button> </sar-button>
<sar-button <sar-button
v-if="item.b_dc_finish !== '1'" v-if="item.b_yx_finish !== '1'"
inline inline
square square
type="default" type="default"
theme="success" theme="success"
size="mini" size="mini"
@click="showConfirmDialog(item)"
> >
确认 确认
</sar-button> </sar-button>
@@ -263,13 +470,16 @@ function handleToFile(itemData) {
} }
.list-item__body { .list-item__body {
padding: 24rpx 0rpx;
display: flex;
flex-direction: column;
@include flexGap(16rpx, 'column');
.list-item__info { .list-item__info {
display: flex; display: flex;
align-items: start; align-items: start;
width: 100%; width: 100%;
font-size: 26rpx; font-size: 26rpx;
line-height: 1; line-height: 1;
margin-top: 16rpx;
.list-item__label { .list-item__label {
display: block; display: block;
@@ -288,7 +498,6 @@ function handleToFile(itemData) {
} }
.list-item__footer { .list-item__footer {
margin-top: 16rpx;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
@include flexGap(36rpx, ''); @include flexGap(36rpx, '');
@@ -2,7 +2,7 @@
"globalStyle": { "globalStyle": {
"navigationStyle": "default", "navigationStyle": "default",
"navigationBarTitleText": "App", "navigationBarTitleText": "App",
"navigationBarBackgroundColor": "#2c3e50", "navigationBarBackgroundColor": "#34495E",
"navigationBarTextStyle": "white", "navigationBarTextStyle": "white",
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
@@ -15,8 +15,8 @@
}, },
"tabBar": { "tabBar": {
"color": "#A0A3A6", "color": "#A0A3A6",
"selectedColor": "#026bff", "selectedColor": "#34495e",
"backgroundColor": "#F8F8F8", "backgroundColor": "#ffffff",
"borderStyle": "white", "borderStyle": "white",
"height": "50px", "height": "50px",
"fontSize": "10px", "fontSize": "10px",
@@ -82,9 +82,9 @@
} }
}, },
{ {
"path": "xcjin/index", "path": "yx/index",
"style": { "style": {
"navigationBarTitleText": "进场堆高机", "navigationBarTitleText": "验箱",
"navigationStyle": "default" "navigationStyle": "default"
} }
} }
@@ -1,5 +1,10 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { loaddatabysqlApi } from '@/request/api'
import { useUserStore } from '@/store'
import { useCounts } from '@/store/counts'
const { taskCounts } = useCounts()
const userStore = useUserStore()
const swiperCurrent = ref(0) const swiperCurrent = ref(0)
const swiperList = [ const swiperList = [
@@ -8,6 +13,58 @@ const swiperList = [
{}, {},
] ]
onShow(() => {
if (!userStore.isLogined) {
return
}
loaddatabysqlApi({
sql: `
SELECT COUNT(*) AS total
FROM v_xc_conyard_in
WHERE b_kd_finish = '1'
AND ISNULL(b_yx_finish, '') <> '1'
AND ISNULL(b_yxman_id, '') IN ('', '${userStore.userInfo.userid}');
`,
orderfield: '',
soption: '',
}).then((res) => {
if (res.data.length > 0) {
taskCounts.yx.todo = res.data[0].total || 0
}
})
loaddatabysqlApi({
sql: `
SELECT COUNT(*) as total
FROM v_xc_conyard_in
WHERE b_yx_finish = '1'
AND ISNULL(b_dc_finish, '') <> '1'
AND ISNULL(b_dcman_id, '') IN ('', '${userStore.userInfo.userid}')
`,
orderfield: '',
soption: '',
}).then((res) => {
if (res.data.length > 0) {
taskCounts.xcjin.todo = res.data[0].total || 0
}
})
loaddatabysqlApi({
sql: `
SELECT COUNT(*) as total
FROM v_xc_conyard_out
WHERE b_kd_finish = '1' AND ISNULL(b_dc_finish, '') <> '1'
AND ISNULL(b_dcman_id, '') IN ('', '${userStore.userInfo.userid}')
`,
orderfield: '',
soption: '',
}).then((res) => {
if (res.data.length > 0) {
taskCounts.xcchu.todo = res.data[0].total || 0
}
})
})
function toLinkUrl(url) { function toLinkUrl(url) {
if (!url) { if (!url) {
return return
@@ -30,19 +87,19 @@ function toLinkUrl(url) {
> >
<swiper-item> <swiper-item>
<image <image
src="@/static/images/800x400.png" src="@/static/images/bg.jpg"
style="width: 100%;height:100%" style="width: 100%;height:100%"
/> />
</swiper-item> </swiper-item>
<swiper-item> <swiper-item>
<image <image
src="@/static/images/800x400.png" src="@/static/images/bg1.jpg"
style="width: 100%;height:100%" style="width: 100%;height:100%"
/> />
</swiper-item> </swiper-item>
<swiper-item> <swiper-item>
<image <image
src="@/static/images/800x400.png" src="@/static/images/bg2.jpg"
style="width: 100%;height:100%" style="width: 100%;height:100%"
/> />
</swiper-item> </swiper-item>
@@ -53,38 +110,46 @@ function toLinkUrl(url) {
/> />
</view> </view>
<view class="grid-container"> <view class="grid-container">
<sar-grid :columns="2" gap="20rpx"> <sar-grid :columns="2" gap="16rpx">
<sar-grid-item <sar-grid-item
text="装箱" text="验箱"
icon="image" icon="image"
:root-style="{ :root-style="{
flex: '0 0 100%', flex: '0 0 100%',
width: '100%', width: '100%',
}" }"
:badge="taskCounts.yx.todo"
:badge-props="{
color: `#E74C3C`,
}"
@click="toLinkUrl('/pages-sub/yx/index')"
> >
<view class="grid-item"> <view class="grid-item">
<image src="@/static/images/柴犬.png" /> <sar-icon family="iconfont" name="jiaoyan" size="128rpx" color="#fff" />
<text>内容</text> <text>验箱</text>
</view> </view>
</sar-grid-item> </sar-grid-item>
<sar-grid-item> <sar-grid-item
:badge="taskCounts.xcjin.todo"
:badge-props="{
color: `#E74C3C`,
}"
@click="toLinkUrl('/pages-sub/xcjin/index')"
>
<view class="grid-item"> <view class="grid-item">
<image src="@/static/images/柴犬.png" /> <sar-icon family="iconfont" name="jin" size="128rpx" color="#fff" />
<text>内容</text>
</view>
</sar-grid-item>
<sar-grid-item>
<view class="grid-item">
<image src="@/static/images/柴犬.png" />
<text>内容</text>
</view>
</sar-grid-item>
<sar-grid-item @click="toLinkUrl('/pages-sub/xcjin/index')">
<view class="grid-item">
<image src="@/static/images/柴犬.png" />
<text>进场堆高机</text> <text>进场堆高机</text>
</view> </view>
</sar-grid-item> </sar-grid-item>
<sar-grid-item
:badge="taskCounts.xcchu.todo"
@click="toLinkUrl('/pages-sub/xcchu/index')"
>
<view class="grid-item">
<sar-icon family="iconfont" name="chu" size="128rpx" color="#fff" />
<text>出场堆高机</text>
</view>
</sar-grid-item>
</sar-grid> </sar-grid>
</view> </view>
</view> </view>
@@ -99,23 +164,34 @@ function toLinkUrl(url) {
} }
} }
.grid-container { .grid-container {
margin-top: 32rpx; padding-top: 32rpx;
:deep(.sar-grid__content) { :deep(.sar-grid__content) {
background-color: var(--sar-primary); background-color: var(--sar-primary);
} }
:deep(.sar-grid) {
row-gap: 0 !important;
}
:deep(.sar-grid__item) {
margin-bottom: 16rpx;
}
:deep(.sar-badge) {
width: 42rpx;
height: 42rpx;
}
.grid-item { .grid-item {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
font-size: 28rpx; font-size: 32rpx;
image { image {
width: 128rpx; width: 128rpx;
height: 128rpx; height: 128rpx;
} }
text { text {
margin-top: 16rpx; margin-top: 16rpx;
font-weight: bold; font-weight: 500;
color: #fff; color: #fff;
} }
} }
@@ -81,16 +81,16 @@ export function delSubRecordApi(params: DelSubRecordParams) {
return request.postForm('/DelSubRecord.jsp', params) return request.postForm('/DelSubRecord.jsp', params)
} }
interface getaliyunkeyParams { interface GetaliyunkeyParams {
orgid: string orgid: string
bucket: string bucket: string
} }
export function getaliyunkeyApi(params: getaliyunkeyParams) { export function getaliyunkeyApi(params: GetaliyunkeyParams) {
return request.postForm(`/getaliyunkey.jsp`, params) return request.postForm(`/getaliyunkey.jsp`, params)
} }
interface aliyunpluploadParams { interface AliyunpluploadParams {
despathfile: string despathfile: string
myfilename: string myfilename: string
size: string size: string
@@ -99,6 +99,15 @@ interface aliyunpluploadParams {
mx_moduleid: string mx_moduleid: string
mx_cate_id: string mx_cate_id: string
} }
export function aliyunpluploadApi(params: aliyunpluploadParams) { export function aliyunpluploadApi(params: AliyunpluploadParams) {
return request.postForm(`/aliyunplupload.jsp`, params) return request.postForm(`/aliyunplupload.jsp`, params)
} }
interface LoaddatabysqlParams {
sql: string
orderfield: string
soption: string
}
export function loaddatabysqlApi(params: LoaddatabysqlParams) {
return request.postForm('/loaddatabysql.jsp', params)
}
@@ -1,7 +1,7 @@
import { useUserStore } from '@/store' import { useUserStore } from '@/store'
const whiteList = [ const whiteList = [
'/pages-sub/login/index' '/pages-sub/login/index',
] ]
export const navigateToInterceptor = { export const navigateToInterceptor = {
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

@@ -0,0 +1,24 @@
// 全局任务数量统计
const taskCounts = reactive({
yx: {
todo: 0,
finished: 0,
total: 0,
},
xcjin: {
todo: 0,
finished: 0,
total: 0,
},
xcchu: {
todo: 0,
finished: 0,
total: 0,
},
})
export function useCounts() {
return {
taskCounts,
}
}
@@ -1,6 +1,6 @@
@font-face { @font-face {
font-family: 'iconfont'; /* Project id 5031675 */ font-family: 'iconfont'; /* Project id 5031675 */
src: url('data:font/ttf;charset=utf-8;base64,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 truncated src: url('data:font/ttf;charset=utf-8;base64,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 truncated
format('truetype'); format('truetype');
} }
@@ -12,6 +12,18 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.iconfont-jin:before {
content: '\e617';
}
.iconfont-chu:before {
content: '\e629';
}
.iconfont-jiaoyan:before {
content: '\e708';
}
.iconfont-updatePassword:before { .iconfont-updatePassword:before {
content: '\e628'; content: '\e628';
} }
@@ -1,12 +1,16 @@
@import 'sard-uniapp/index.scss'; @import 'sard-uniapp/index.scss';
@import './iconfont.css'; @import './iconfont.css';
@import './mixins.scss';
page, page,
.sar-portal { .sar-portal {
--sar-input-border-color: #ddd; --sar-input-border-color: #ddd;
--sar-primary: #34495E; --sar-primary: #34495e;
--sar-rounded: 4rpx; --sar-rounded: 4rpx;
} }
.sar-upload__wrapper {
gap: 0rpx !important;
@include flexGap(16rpx, '');
}
.picker-select__pagination-root { .picker-select__pagination-root {
width: 100%; width: 100%;
@@ -206,6 +206,9 @@ export function downloadFile(fileUrl: string, fileName?: string) {
/** =================== H5 下载 =================== */ /** =================== H5 下载 =================== */
async function downloadH5(fileUrl: string, fileName: string) { async function downloadH5(fileUrl: string, fileName: string) {
try { try {
console.log(fileUrl)
console.log(fileName)
const response = await fetch(fileUrl, { mode: 'cors' }) const response = await fetch(fileUrl, { mode: 'cors' })
if (!response.ok) if (!response.ok)
throw new Error(`下载失败: ${response.status}`) throw new Error(`下载失败: ${response.status}`)
+360 -112
View File
@@ -1,119 +1,367 @@
<!DOCTYPE html> <!doctype html>
<html lang="zh"> <html lang="zh-CN">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>附件管理</title> <title>物流管理系统 - 首页</title>
<style> <style>
body { * {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; margin: 0;
background-color: #f8f9fa; padding: 0;
margin: 0; box-sizing: border-box;
padding: 0; font-family: 'Helvetica Neue', Arial, sans-serif;
} }
.header {
background-color: #2c3e50;
color: #fff;
padding: 15px;
text-align: center;
font-size: 18px;
}
.upload-area {
background: #fff;
margin: 15px;
padding: 15px;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.05);
}
.upload-area input[type="file"] {
display: none;
}
.upload-label {
display: block;
text-align: center;
padding: 20px;
border: 2px dashed #ccc;
border-radius: 8px;
color: #666;
cursor: pointer;
}
.attachment-list {
margin: 15px;
}
.attachment-item {
background: #fff;
border-radius: 8px;
padding: 10px;
margin-bottom: 10px;
display: flex;
align-items: center;
justify-content: space-between;
box-shadow: 0 2px 5px rgba(0,0,0,0.05);
}
.attachment-info {
display: flex;
align-items: center;
gap: 10px;
}
.attachment-thumb {
width: 50px;
height: 50px;
border-radius: 4px;
object-fit: cover;
background-color: #eaeaea;
}
.attachment-name {
font-size: 14px;
color: #333;
}
.attachment-actions button {
margin-left: 5px;
padding: 5px 10px;
border-radius: 4px;
border: none;
cursor: pointer;
font-size: 13px;
}
.btn-primary {
background-color: #2c3e50;
color: white;
}
.btn-danger {
background-color: #e74c3c;
color: white;
}
</style>
</head>
<body>
<div class="header">附件管理</div>
<div class="upload-area"> body {
<label for="file-upload" class="upload-label">点击上传附件</label> background-color: #f5f7fa;
<input type="file" id="file-upload" multiple /> color: #333;
</div> line-height: 1.6;
}
<div class="attachment-list"> .container {
<div class="attachment-item"> max-width: 1200px;
<div class="attachment-info"> margin: 0 auto;
<img src="https://via.placeholder.com/50" class="attachment-thumb" /> padding: 20px;
<div class="attachment-name">工单图片1.jpg</div> }
/* 头部样式 */
header {
background-color: #34495e;
color: white;
padding: 15px 20px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
border-radius: 0 0 10px 10px;
margin-bottom: 20px;
}
.header-content {
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
font-size: 24px;
font-weight: bold;
}
.user-info {
display: flex;
align-items: center;
}
.user-info img {
width: 40px;
height: 40px;
border-radius: 50%;
margin-right: 10px;
}
/* 轮播图样式 */
.carousel {
position: relative;
height: 300px;
overflow: hidden;
border-radius: 10px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
margin-bottom: 30px;
}
.carousel-inner {
position: relative;
width: 100%;
height: 100%;
}
.carousel-item {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
transition: opacity 1s ease-in-out;
background-size: cover;
background-position: center;
display: flex;
align-items: center;
justify-content: center;
color: white;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
font-size: 2rem;
font-weight: bold;
}
.carousel-item.active {
opacity: 1;
}
.carousel-item:nth-child(1) {
background:
linear-gradient(rgba(52, 73, 94, 0.7), rgba(52, 73, 94, 0.7)),
url('https://images.unsplash.com/photo-1601493700631-2b16ec4b4716?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxfDB8MXxyYW5kb218MHx8d2FyZWhvdXNlfHx8fHx8MTY5OTQwODQ0MQ&ixlib=rb-4.0.3&q=80&utm_campaign=api-credit&utm_medium=referral&utm_source=unsplash_source&w=1080');
}
.carousel-item:nth-child(2) {
background:
linear-gradient(rgba(52, 73, 94, 0.7), rgba(52, 73, 94, 0.7)),
url('https://images.unsplash.com/photo-1488521787991-ed7bbaae773c?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxfDB8MXxyYW5kb218MHx8dHJ1Y2t8fHx8fHwxNjk5NDA4NDYy&ixlib=rb-4.0.3&q=80&utm_campaign=api-credit&utm_medium=referral&utm_source=unsplash_source&w=1080');
}
.carousel-item:nth-child(3) {
background:
linear-gradient(rgba(52, 73, 94, 0.7), rgba(52, 73, 94, 0.7)),
url('https://images.unsplash.com/photo-1518458028785-8fbcd101ebb9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxfDB8MXxyYW5kb218MHx8Y29udGFpbmVyfHx8fHx8MTY5OTQwODQ3Mg&ixlib=rb-4.0.3&q=80&utm_campaign=api-credit&utm_medium=referral&utm_source=unsplash_source&w=1080');
}
.carousel-controls {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
}
.carousel-indicator {
width: 12px;
height: 12px;
border-radius: 50%;
background-color: rgba(255, 255, 255, 0.5);
margin: 0 5px;
cursor: pointer;
}
.carousel-indicator.active {
background-color: white;
}
/* 操作模块样式 */
.operations {
margin-top: 20px;
}
.section-title {
color: #34495e;
font-size: 1.5rem;
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 2px solid #e0e6ed;
}
.operation-cards {
display: flex;
flex-direction: column;
gap: 20px;
}
.operation-row {
display: flex;
gap: 20px;
}
.operation-card {
background: white;
border-radius: 10px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08);
padding: 25px;
transition:
transform 0.3s,
box-shadow 0.3s;
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.operation-card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
}
.operation-icon {
width: 70px;
height: 70px;
background-color: #eef5ff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
}
.operation-icon i {
font-size: 32px;
color: #34495e;
}
.operation-title {
font-size: 1.3rem;
font-weight: bold;
color: #34495e;
margin-bottom: 10px;
}
.operation-desc {
color: #7f8c8d;
font-size: 0.95rem;
margin-bottom: 20px;
flex-grow: 1;
}
.btn {
background-color: #34495e;
color: white;
border: none;
padding: 10px 25px;
border-radius: 25px;
font-size: 1rem;
cursor: pointer;
transition: background-color 0.3s;
width: 80%;
max-width: 200px;
}
.btn:hover {
background-color: #2c3e50;
}
.check-operation {
width: 100%;
}
/* 底部样式 */
footer {
margin-top: 40px;
text-align: center;
color: #7f8c8d;
font-size: 0.9rem;
padding: 20px;
border-top: 1px solid #e0e6ed;
}
/* 响应式设计 */
@media (max-width: 768px) {
.operation-row {
flex-direction: column;
}
.carousel {
height: 200px;
}
.carousel-item {
font-size: 1.5rem;
}
}
</style>
</head>
<body>
<header>
<div class="header-content">
<div class="logo">物流管理系统</div>
<div class="user-info">
<img src="https://ui-avatars.com/api/?name=管理员&background=random" alt="用户头像" />
<span>管理员</span>
</div>
</div> </div>
<div class="attachment-actions"> </header>
<button class="btn-primary">预览</button>
<button class="btn-danger">删除</button> <div class="container">
<!-- 轮播图 -->
<div class="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<div>高效物流管理,提升运营效率</div>
</div>
<div class="carousel-item">
<div>智能仓储解决方案</div>
</div>
<div class="carousel-item">
<div>实时追踪,全程可视</div>
</div>
</div>
<div class="carousel-controls">
<div class="carousel-indicator active"></div>
<div class="carousel-indicator"></div>
<div class="carousel-indicator"></div>
</div>
</div>
<!-- 操作模块 -->
<div class="operations">
<h2 class="section-title">核心操作</h2>
<div class="operation-cards">
<!-- 验箱单独一行 -->
<div class="operation-card check-operation">
<div class="operation-icon">
<i>📦</i>
</div>
<h3 class="operation-title">验箱</h3>
<p class="operation-desc">对集装箱进行质量检查、状态评估和记录,确保运输安全</p>
<button class="btn">开始验箱</button>
</div>
<!-- 进场和出场在同一行 -->
<div class="operation-row">
<div class="operation-card">
<div class="operation-icon">
<i>⬇️</i>
</div>
<h3 class="operation-title">进场</h3>
<p class="operation-desc">记录集装箱进入仓库或场站的信息,包括时间、位置和状态</p>
<button class="btn">进场登记</button>
</div>
<div class="operation-card">
<div class="operation-icon">
<i>⬆️</i>
</div>
<h3 class="operation-title">出场</h3>
<p class="operation-desc">记录集装箱离开仓库或场站的信息,生成出库单据</p>
<button class="btn">出场登记</button>
</div>
</div>
</div>
</div> </div>
</div> </div>
<div class="attachment-item"> <footer>
<div class="attachment-info"> <p>© 2023 物流管理系统 | 版本 2.1.0</p>
<div class="attachment-thumb"></div> </footer>
<div class="attachment-name">报告文档.pdf</div>
</div> <script>
<div class="attachment-actions"> // 轮播图功能
<button class="btn-primary">预览</button> document.addEventListener('DOMContentLoaded', function () {
<button class="btn-danger">删除</button> const items = document.querySelectorAll('.carousel-item')
</div> const indicators = document.querySelectorAll('.carousel-indicator')
</div> let currentIndex = 0
</div>
</body> function showSlide(index) {
// 隐藏所有幻灯片
items.forEach((item) => item.classList.remove('active'))
indicators.forEach((indicator) => indicator.classList.remove('active'))
// 显示当前幻灯片
items[index].classList.add('active')
indicators[index].classList.add('active')
currentIndex = index
}
// 添加指示器点击事件
indicators.forEach((indicator, index) => {
indicator.addEventListener('click', () => {
showSlide(index)
})
})
// 自动轮播
setInterval(() => {
let nextIndex = (currentIndex + 1) % items.length
showSlide(nextIndex)
}, 5000)
})
</script>
</body>
</html> </html>